在Chrome开发工具网络标签中可以看到"请求有效负载"与"表单数据"之间的区别

red*_*888 224 forms rest post http google-chrome-devtools

我有一个旧的Web应用程序,我必须支持(我没有写).

当我填写表格并提交然后检查Chrome中的"网络"标签时,我会看到"请求有效负载",我通常会看到"表单数据".两者之间有什么区别,何时会发送一个而不是另一个?

谷歌搜索这个,但没有找到任何解释这个的信息(只是人们试图让javascript应用程序发送"表单数据"而不是"请求有效负载".

lef*_*loh 252

请求有效负载 - 或者更确切地说:HTTP请求的有效负载主体 - 是通常由POST或PUT请求发送的数据.它的头和后面的部分CRLFA的HTTP请求.

请求Content-Type: application/json可能如下所示:

POST /some-path HTTP/1.1
Content-Type: application/json

{ "foo" : "bar", "name" : "John" }
Run Code Online (Sandbox Code Playgroud)

如果您按照AJAX提交此内容,浏览器只会向您显示它作为有效负载正文提交的内容.这就是它所能做的一切,因为它不知道数据来自何处.

如果您使用method="POST"和提交HTML表单,Content-Type: application/x-www-form-urlencoded或者Content-Type: multipart/form-data您的请求可能如下所示:

POST /some-path HTTP/1.1
Content-Type: application/x-www-form-urlencoded

foo=bar&name=John
Run Code Online (Sandbox Code Playgroud)

在这种情况下,表单数据是请求有效负载.这里浏览器知道更多:它知道bar是提交表单的输入字段foo的值.这就是它向你展示的东西.

因此,它们的不同之处在于Content-Type数据的提交方式不同.在这两种情况下,数据都在消息体中.Chrome会在开发者工具中区分数据的呈现方式.

  • 是否有理由在大小等方面更喜欢一个.特别是对于轻量级AJAX调用? (3认同)
  • 如果我发送一个AJAX调用,我可以将内容类型设置为`json`或`x-www-form-urlencoded`.前者将数据作为请求有效载荷发送,而后者将其编码为url查询.两者似乎都很好.是否有理由更喜欢其中之一?我看到Twitter,Google,Facebook,Stackoverflow等大多数网站都将内容类型设置为"x-www-form-urlencoded".任何具体原因? (3认同)
  • 这与OP无关,但可能[这个答案有帮助](http://stackoverflow.com/a/13457437). (2认同)

Moh*_*eza 13

在Chrome中,使用'Content-Type:application/json'的请求显示为Request PayedLoad并将数据作为json对象发送.

但是使用'Content-Type:application/x-www-form-urlencoded'的请求 显示表单数据并将数据作为键:值对发送,因此如果您在一个键中有对象数组,则会将该键的值展开:

{ Id: 1, 
name:'john', 
phones:[{title:'home',number:111111,...},
        {title:'office',number:22222,...}]
}
Run Code Online (Sandbox Code Playgroud)

发送

{ Id: 1, 
name:'john', 
phones:[object object]
phones:[object object]
}
Run Code Online (Sandbox Code Playgroud)

  • downvoted,因为没有"json对象"这样的东西.发送的json数据作为普通字符串发送,因为json本质上是一个字符串.您当然可以使用json_encode将其转换为标准"对象",但这也不会使其成为"json对象". (4认同)
  • 当它被解析时,它被称为“对象文字”。当它被“字符串化”(转换为字符串)时,它被称为 JSON(JavaScript 对象表示法)格式。但 JavaScript 对象的正确名称是“Object Literal” (2认同)