开发中同事问了我一个问题
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...

03-05 16:04