乐趣区

关于前端:前端基础-HTTP请求GET与POST

开发中共事问了我一个问题
Q: GET 申请能不能用 request body 来传递数据?
这个问题的场景是,他们的前后端沟通须要携带简单的参数,用 POST 办法的 request body(key value)的模式传参会更加明了,但又感觉不够语义化,所以想到了 GET + request body。

A: HTTP 标准 rfc2616 中是没有对 GET 办法的应用 body 做限度(HTTP 标准并未规定 GET 不能发送 request body),但发送申请的载体(如浏览器、postman)会对 GET 申请的 request body 做出限度,chrome 会间接把 GET 申请中的 request body 置空,Postman,在抉择 GET 时 Body 标签是灰色不可用的。

在新的标准 rfc7231 中,明确阐明了在 GET 申请上发送 request body 可能会导致某些现有实现回绝该申请。

“A payload within a GET request message has no defined semantics;
sending a payload body on a GET request might cause some existing
implementations to reject the request.”

rfc2616
https://www.w3.org/Protocols/… 9.3 GET
rfc7231
https://datatracker.ietf.org/…
Q: GET 发申请时 URL 的长度有限度吗?

A: HTTP 协定未对 URL 长度做限度,但发送申请的载体(如浏览器)会对 URL 的长度做出限度。不同浏览器的长度限度可能存在不同。Chrome 将 IPC 反序列化的 url 长度限度为 2MB。(Chrome is restricting the length of URLs that can be deserialized from IPC to 2MB – 出自 chromium 论坛,2011 年,https://bugs.chromium.org/p/c…)
(只记住 2MB 这个论断。留神 2MB 不是 2048 个字符,也不是 2000 个字符,2MB 相当于 2097152 个字符,这与另一个被广为流传的答案 - 字符长度 2000 个字符齐全不同,2000 字符这个答案的最早出处我无从讲究
https://www.geeksforgeeks.org…)

Q: GET 申请和 POST 申请还有哪些不同?
A: GET 和 POST 实质上都是 TCP 链接。然而因为 HTTP 的规定和浏览器 / 服务器的限度,导致他们在实现上有区别。
对于 GET 申请,浏览器会把 request header 和 data 一并发送进来,胜利状态,服务器响应 200,返回数据。(只需一次发包)
而对于 POST 申请,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,胜利状态,服务器响应 200,返回数据。(两次发包)

看上去 POST 须要发包两次,工夫耗费更多一点。但在网络环境好的状况下,发一次包的工夫和发两次包的工夫差异根本能够忽视。而在网络环境差的状况下,两次包的 TCP 在验证数据包完整性上,有十分大的劣势。

注:并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。

同步更新到本人的语雀
https://www.yuque.com/diracke…

退出移动版