【问题标题】:How to capture a plain copy of my HTTP request如何捕获我的 HTTP 请求的纯副本
【发布时间】:2015-05-12 18:03:23
【问题描述】:

我正在尝试使用 cURL 和 PHP 与 anREST API 进行通信。但是,我从 API 中遇到了一个问题,我需要能够以纯文本形式查看我的 HTTP 请求,以便我可以对其进行分析和更正。

我尝试了以下方法将我的请求写入文件

        $file = fopen('request.txt', 'w');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
        curl_setopt($ch, CURLOPT_VERBOSE, true);    
        curl_setopt($ch, CURLOPT_STDERR, $file);        

但这并没有显示 JSON 数据。

这是我在 request.txt 文件中得到的内容

* Hostname servername was found in DNS cache
*   Trying INTERNAL IP...
* Connected to servername (INTERNAL IP) port 8018 (#0)
> PUT /icws/1163386002/messaging/subscriptions/queues/blahblah HTTP/1.1
Host: servername:8018
Accept: */*
ININ-ICWS-CSRF-Token: WAhtYWxoYXlla1dBY2GHSDMNDFtjMDcwZmIyYy1mguc4LTQ3YjEtODgzMy1iOTBkM2ZhYWHfoyNmYTlYCjEwLjAuNC4xNjA=
ININ-ICWS-Session-ID: 1163386002
Cookie: icws_1163386002=232sggsdfgdabe-404c-8d8c-12345dfgdfg
Content-Length: 156
Content-Type: application/x-www-form-urlencoded

* upload completely sent off: 156 out of 156 bytes
< HTTP/1.1 500 Internal Server Error
< Cache-Control: no-cache, no-store, must-revalidate
< Pragma: no-cache
< Expires: 0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Content-Type: application/vnd.inin.icws+JSON; charset=utf-8
< Date: Tue, 12 May 2015 17:52:52 GMT
< Server: HttpPluginHost
< Content-Length: 90
< 
* Connection #0 to host servername left intact

我想以纯文本格式查看 JSON 字符串。

这是我使用 PHP 进行 cURL 调用的方式

private function _processRequest($method, $uri, $data = false, $header = NULL, &$httpRespond = array(), &$httpCode = NULL)
{
    $ch = curl_init();
    $url = $this->_baseURL . $uri;

    if( 
           ($method == 'POST' || $method == 'PUT') 
        && $data
    ){
        $jsonString = json_encode( $data );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, $jsonString );
    }

    if($method == 'POST'){
        curl_setopt($ch, CURLOPT_POST, true);
    } elseif( $method == 'PUT'){
        //curl_setopt($ch, CURLOPT_PUT, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
    } else {
        if ($data){
            $url = sprintf("%s?%s", $url, http_build_query($data));
        }
    }   

    //disable the use of cached connection
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);

    //return the respond from the API
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    //return the HEADER respond from the API
    curl_setopt($ch, CURLOPT_HEADER, true);

    //add custom headers
    if(!empty($header)){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }

    //enable SSL
    if( $this->_protocol == 'https' ){
        curl_setopt($ch, CURLOPT_CAINFO, $this->_cainfo);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
    }

    //set the URL
    curl_setopt($ch, CURLOPT_URL, $url);

        $file = fopen('request.txt', 'w');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
        curl_setopt($ch, CURLOPT_VERBOSE, true);    
        curl_setopt($ch, CURLOPT_STDERR, $file);        


    $respond = curl_exec($ch);

    //throw cURL exception
    if($respond === false){
        $errorNo = curl_errno($ch);
        $errorMessage = curl_error($ch);

        throw new ApiException($errorMessage, $errorNo);
    }   

    list($header, $body) = explode("\r\n\r\n", $respond, 2);

    $httpRespond = $this->_http_parse_headers($header);


    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  

    $result = json_decode($body, true);

    return $result;
}

如何以纯文本形式查看整个 HTTP 请求?

【问题讨论】:

  • 您收到 HTTP 500 错误响应。如果出现内部错误,您确定您的应用程序会提供带有 JSON 的正文吗?
  • 是的,我收到 HTTP 500 内部错误。这是来自 API 的响应,当我查看 API 日志时,我得到这个“这个 jsonlib::Value 不是 eValueType_Array 类型”所以我想查看纯文本以查看 json 是否具有正确的数据

标签: php json http curl icws


【解决方案1】:

您可以使用 Fiddler (http://www.telerik.com/fiddler) 以纯文本形式查看完整的请求/响应,并测试您的 REST API。

此外,您可以使用 Wireshark (https://www.wireshark.org/) 应用 HTTP 过滤器。

我的推荐是 Fiddler,我经常使用它来测试和调试我的 REST API。

希望对你有帮助

【讨论】:

  • 如何使用 Fiddler?我应该将它安装在 apache 服务器、我的 PC 还是 API 服务器上?在哪个部分我可以看到我的纯文本请求?请注意,我的 Apache 服务器是 HTTPS,但我仅通过 HTTP 发送请求
  • 您必须将它安装在您执行请求的客户端计算机中。
  • 好的,这就是我所做的。我确实在左侧看到了请求,但在哪里可以找到纯文本请求?
  • 双击请求。在屏幕右侧,您将屏幕分成 2 部分(顶部和底部)。顶部是您的完整请求,底部是您的完整响应。在选项卡(顶部和底部)中,您可以选择 Raw。那里有你的原始请求(顶部)和原始响应(底部)
  • 我不确定我错过了什么。我点击了左侧平底锅的请求。然后在右侧“顶部”单击“textView”选项卡。但似乎结果是加密的。在 JSON 选项卡中,我只看到 2 个节点x(即 0 x17
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2020-04-27
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多