在Chrome调试器中看不到HTTP POST有效负载?

时间:2015-12-01 08:23:59

标签: google-chrome post http-post google-chrome-devtools

我已查看thisthat。但是,我的调试器如下所示。

失败示例

No form data, No raw content

没有表单数据,没有原始内容

原始示例(*虽然路径与屏幕截图不同,但它们都无法读取帖子数据)

POST https://192.168.0.7/cgi-bin/icul/;stok=554652ca111799826a1fbdafba9d3ac1/remote_command HTTP/1.1
Host: 192.168.0.7
Connection: keep-alive
Content-Length: 419
accept: application/json, text/javascript, */*; q=0.01
Origin: https://192.168.0.7
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
content-type: application/x-www-form-urlencoded; charset=UTF-8
Referer: https://192.168.0.7/cgi-bin/icul/;stok=554652ca111799826a1fbdafba9d3ac1/smartmomentl/access-point/network
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4
Cookie: sysauth=f15eff5e9ebb8f152e163f8bc00505c6

command=import&args=%7B%22--json%22%3Atrue%2C%22--force%22%3Atrue%2C%22--mocks%22%3A%22%7B%5C%22DEL%5C%22%3A%7B%7D%2C%5C%22SET%5C%22%3A%7B%5C%22dhcp%5C%22%3A%7B%5C%22lan%5C%22%3A%7B%5C%22.section%5C%22%3A%5C%22dhcp%5C%22%2C%5C%22interface%5C%22%3A%5C%22lan%5C%22%2C%5C%22ignore%5C%22%3A%5C%220%5C%22%2C%5C%22leasetime%5C%22%3A%5C%2212h%5C%22%2C%5C%22range%5C%22%3A%5C%22172.16.0.100-172.16.0.200%5C%22%7D%7D%7D%7D%22%7D

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Status: 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Expires: 0
Transfer-Encoding: chunked
Date: Thu, 01 Jan 1970 00:09:27 GMT
Server: lighttpd/1.4.30

31
{ "ctx": "No such command", "exitStatus": false }
0

注意:(6)

成功案例

Some of them are able to work

我发现它们之间存在差异(通过区分标题内容)

原始示例(*虽然路径与屏幕截图不同,但它们都无法读取帖子数据)

POST https://192.168.0.7/cgi-bin/icul/;stok=92dea2b939b9fceb44ac84ac859de7f4/;stok=92dea2b939b9fceb44ac84ac859de7f4/remote_command HTTP/1.1
Host: 192.168.0.7
Connection: keep-alive
Content-Length: 53
Accept: application/json, text/javascript, */*; q=0.01
Origin: https://192.168.0.7
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: https://192.168.0.7/cgi-bin/icul/;stok=92dea2b939b9fceb44ac84ac859de7f4/remote_command/command_reboot
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4
Cookie: sysauth=683308794904e0bedaaead33acb15c7e

command=command_reboot&args=%7B%22--json%22%3Atrue%7D

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Status: 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Expires: 0
Transfer-Encoding: chunked
Date: Thu, 01 Jan 1970 00:02:46 GMT
Server: lighttpd/1.4.30

34
{ "ctx": "\u0022success\u0022", "exitStatus": true }
0

注意:(6)

两个示例之间的标头差异

  • 成功的人正在使用Jquery binding,而使用HTTPS from nodejs + browserify失败的人则使用fiddle here。但是,我仍然在寻找一种方法来检查这是否是一个问题(未经测试)

  • 缺少X-Requested-With: XMLHttpRequest。但是,将此标头添加回请求并不能解决此问题(已测试)

  • Capital header vs Smaller letter header field(

    • content-typeContent-type。然而,这种差异不是gist(已测试)中尝试过的问题的根本原因

    • Accept vs accept(未经测试)

注:(5)(7)

但是,我不确定为什么c中的第一个content-type是小写字母。

注意:(1)

我尝试了什么

我已经尝试过使用firebug的Firefox。它能够显示我的有效载荷。但是,它无法解析来自服务器的响应:'(

由于Web服务器以HTTPS协议运行,因此无法通过wireshark捕获数据包。有关调试POST请求的任何建议吗?感谢。

通过命令行链接到this method from nodejs有关调试HTTP(s)请求的信息。注意:(3)

Wrapper我正在使用

我使用promise调用包裹Full source here。下面是一个片段显示我使用过的选项。

/**
 * Wraps HTTPS module from nodejs with Promise
 * @module common/http_request
 */

var createRequestSetting = function (host, path, data, cookies) {
    return {
        method: 'POST',
        port:443,
        host: host,
        path: path,
        headers: {
            Accept: 'application/json, text/javascript, */*; q=0.01',
            'Content-Type':
                'application/x-www-form-urlencoded; charset=UTF-8',
            'Content-Length': Buffer.byteLength(data),
            'Cookie': cookies,
        },
        rejectUnauthorized: false,
    };
};

the fiddle

注意:(2)

更新

  • (1)我已验证字母c不会影响Chrome调试器。这是gist from me。我尝试使用XMLHttpRequest字母c来模仿相同的请求。我仍然可以在调试器中检查表单数据。
  • (2)链接到完整源代码
  • (3)链接到{{3}}关于测试HTTP(s)请求的脚本
  • (4)重新格式化问题以便于阅读
  • (5)代码检查后,示例未使用相同的绑定
  • (6)添加原始标题示例
  • (7)添加比较会话

8 个答案:

答案 0 :(得分:129)

Chrome v61和v62在所有平台上都存在回归错误,当响应(以及其他)为302时,导致此行为。这已在v63 stable中修复,该版本于2017年12月6日发布到所有桌面平台。< / p>

分阶段进行自动更新,但转到&#34;帮助&#34; /&#34;关于Google Chrome&#34;将强制它下载更新并给你一个重启按钮。有时,有必要终止所有Chrome进程并手动重新启动以获取更新。

(现已关闭)错误报告为here。发布公告为here

显然,这不是2015年原版海报问题的原因,但搜索问题引发了我的兴趣。另请注意,这不仅仅是OS X问题。

答案 1 :(得分:16)

如果您的应用程序返回302状态代码,而Chrome Devtools中没有有效负载数据,则可能是hitting this Chrome bug

如果您正在开发中,或者这是一个不会破坏任何内容的URL,一个快速,非常实用的解决方法是修改您的服务器端代码以发送200,例如在您可能添加的PHP中:

die("premature exit - send a 200");

发出200状态代码。这适用于“302 bug” - 直到它被修复。

P.S。 Per @ leo-hendry下面,Canary确实有截至2017年12月的修复,但是如果你没有其他理由来运行Canary,那么并行运行另一个浏览器将不值得,因为主线版应该很快就要出来了。

答案 2 :(得分:3)

我刚注意到,如果您选择&#34; Doc&#34;则无法看到POST数据。来自Chrome调试器中的过滤器(在All,Xhr,Css,JS ...旁边)。如果您选择&#34;全部&#34;。

,它会显示

答案 3 :(得分:1)

如果这是一个错误,它可能在Mac与Windows上表现不同。

以下屏幕截图来自Windows上的Chrome 63。您可以按预期看到请求有效内容部分。

Good Example

以下是我在Mac上运行的Chrome 65 Beta上看到的内容。请注意,请求有效负载部分丢失。

Bad example

我是否正确地认为错误没有修复或者我应该检查其他什么?

答案 4 :(得分:0)

您的代码看起来不错。您是否检查过Chrome控制台是否有错误? 如果您可以访问服务器(假设它在Linux上为httpd),您可以创建一个小的CGI shell脚本来检查该端的标头和数据:

#!/bin/bash

echo "Content-type: text/plain"
echo ""    
echo "Hello World. These are my environment variables:"
/usr/bin/env
if [ "$REQUEST_METHOD" = "POST" ]; then
    if [ "$CONTENT_LENGTH" -gt 0 ]; then
        echo "And this is my POST data:"
        /bin/cat
    fi
fi
exit 0

答案 5 :(得分:0)

Chrome控制台(Chrome 69)可能遇到相同的问题

formdata和有效负载选项卡均未显示。 在我的场景中,我将带有enctype“ multipart / form-data”的表单过帐到iframe(通过https将图像文件提交到相同的来源)。它按预期工作,但当根本不显示chrome时,我不知道如何正确调试数据。我可以将数据转储到PHP中,但这没有必要太复杂,并且完全失去了使用控制台的意义。我已经通读了上面建议的解决方案,但是并没有摆脱这个问题。 (响应代码是200 btw,而不是302)。

Formdata and payload missing

$_POST = Array
(
    [xajax] => 1
    [app] => products
    [cmd] => upload
    [cat] => 575
)

$_FILES = Array
(
    [upfile] => Array
    (
        [name] => Aufkleber_Trollface.jpg
        [type] => image/jpeg
        [tmp_name] => /tmp/phpHwYkKD
        [error] => 0
        [size] => 25692
    )
)

答案 6 :(得分:0)

我遇到了另一个问题,我的 POST 参数在某个地方也丢失了,即使在后端和 Chrome 标头中也是如此,原因是代码中的一个非常简单的错误。

我只是错误地将 params 对象声明为普通数组:

var params = [];

代替:

var params = {};

然后分配给它参数,结果是什么,我没有出错,但是没有用:

params['param1'] = 'param1';
params['param2'] = 'param2';

$.post(url, params, function(data) {... 

这样,后端没有发送或接收数据,与未显示相同,因为未在调试器中发送。有时可能会节省几个小时或几个小时。

答案 7 :(得分:-2)

虽然这不是原始问题的答案,但我的替代方案是用 form-data es6-promise 同构的组合替换原始实现。 -fetch

所有包都可以从npm下载。

它很有魅力。