ChatGPT解决这个技术问题 Extra ChatGPT

在 Chrome 开发工具网络选项卡中看到的“请求有效负载”与“表单数据”之间有什么区别

我有一个必须支持的旧 Web 应用程序(不是我写的)。

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

谷歌搜索了这个,但并没有真正找到任何解释这一点的信息(只是人们试图让 JavaScript 应用程序发送“表单数据”而不是“请求有效负载”。

还是不明白这两者有什么区别。 “请求有效负载”只是一个没有用类型编码的请求吗?

C
Community

请求有效负载 - 或更准确地说:payload body of a HTTP Request

是通常由 POST 或 PUT 请求发送的数据。它是 HTTP 请求的标头和 CRLF 之后的部分。

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

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

{ "foo" : "bar", "name" : "John" }

如果您按 AJAX 提交此内容,浏览器只会向您显示它作为有效负载主体提交的内容。这就是它所能做的一切,因为它不知道数据来自哪里。

如果您提交带有 method="POST"Content-Type: application/x-www-form-urlencodedContent-Type: multipart/form-data 的 HTML 表单,您的请求可能如下所示:

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

foo=bar&name=John

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

因此,它们在 Content-Type 上有所不同,但在提交数据的方式上没有区别。在这两种情况下,数据都在消息体中。 Chrome 会区分数据在开发者工具中呈现给您的方式。


是否有理由在大小等方面更喜欢另一个。特别是对于轻量级 AJAX 调用?
@buffer 对不起,我不明白你的问题。
如果我要发送 AJAX 调用,我可以将 content-type 设置为 jsonx-www-form-urlencoded。前者将数据作为请求负载发送,而后者将其编码为 url 查询。两者似乎都工作正常。有理由偏爱其中之一吗?我看到 Twitter、Google、Facebook、Stackoverflow 等大多数网站都将内容类型设置为 x-www-form-urlencoded。有什么具体原因吗?
这与 OP 并不真正相关,但可能与 this answer helps 相关。
我的浏览器仅以单个字符串(无对)“*abc123”的形式发送请求有效负载,内容类型为 Application/Json;charset=UTF-8 - 但您的所有示例都显示密钥对。这如何有效?
M
Mohammadreza

在 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,...}]
}

发送

{ Id: 1, 
name:'john', 
phones:[object object]
phones:[object object]
}

PHP当然是邪恶的。 application/x-www-form-urlencoded 的流行度是由 PHP 的流行度定义的。
因为没有“json对象”之类的东西而被否决。发送的 json 数据作为纯字符串发送,因为 json 本质上是一个字符串。您当然可以使用 json_encode 将其转换为标准“对象”,但这也不能使其成为“json对象”。
好的,我认为 javascript json 模板对象或只是 javascript 对象更好
只是“json”或者如果你想强调类型“json string”就可以了。
当它被解析时,它被称为“对象文字”。当它被“字符串化”(转换为字符串)时,它被称为 JSON(JavaScript 对象表示法)格式。但是 JavaScript 对象的正确名称是“Object Literal”
D
Dave Fort

tl; lefloh 博士(优秀)的回答:

如果 HTTP 请求有消息体,则它是“请求有效负载”

“表单数据”是请求有效负载的子集,其中正文被编码为 key1=value1&key2=value2

每当 Google Chrome 可以将表单数据与通用请求有效负载区分开来时,它都会自定义格式