https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=100002489&idx=5&sn=b5d364d6150336b8c523041732b00173&chksm=7a4975084d3efc1eba31f375b4c08670a2594e647ac7ac434e03bf0faeb779264b55319439a9&mpshare=1&scene=1&srcid=02020bfrlw2aegyhHH4mdjTY&key=d1dd5c9a0a50c21a83462e8ec5c3bcc596bf68b5dec5e79a70fa4d4f5ed31fd590828b60058af47eb4e81a55e3ee5edd867935bad052f05c4e5150782190a00cff6c76b2b16aa8ad20be0e08c5eb0efe&ascene=0&uin=MTA2NzUxMDAyNQ%3D%3D&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F2511)&version=11020012&lang=zh_CN&pass_ticket=sv4l%2BGEe3jDMSGyGy8HbXOjLuiqF00ftuchHsiP4ANQLuOaLo%2FLBiGBEJRndwZZ5
你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
HTTP只是个行为准则
由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。
所以对于get请求来说,标准中,content-type是无意义的,因为参数跟在url后面,body里面是没有东西的,服务器一般不会去读body
1.0版规定,头信息必须是 ASCII 码(这也是为什么请求,特别是get请求url中有中文要encode的原因,get请求一般参数跟在url后面,在http中,而不是像post那样在body中),后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type
字段的作用。
如text/html 、application/json;charset=UTF-8 (http协议简史)
2019.12.2避谣:
https://blog.csdn.net/zerooffdate/article/details/78962818
HTTP POST请求发送两个TCP包?
作者抓包验证了一下
postman http的一个post请求只发了一个tcp包
浏览器——同样一个包
那么什么时候出现两个包?
1)发两个包的浏览器
2)发两个包的http client——Ruby's Net::HTTP
splits POST requests across two TCP packets - one for the headers, and another for the body. 关于tcp delayedack实践(三)服务间调用
而且也不是因为“浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok”
另外,为表诚意,我仔细搜索了相关内容,发现确实是有发两个包的情况的,但是并不是跟作者说的那样,先发post的header,返回一个100继续,而是先发一个tcp包,把header发过去,然后因为nagle算法的原因,就等待一个tcp的ack,然后再发剩下的包。
原文章在这里(https://gocardless.com/blog/in-search-of-performance-how-we-shaved-200ms-off-every-post-request/),主要内容是作者发现post比get多200ms,然后深入研究,发现ruby的net::HTTP库,会将一个http请求拆分,先发送header部分。另外,由于没有设置TCP_NODELY,所以第一个包之后要等待ack,才发下一个包,导致了一个请求有200ms的延迟。有一个中文博客引用了这篇文章(https://www.zybuluo.com/babydragon/note/225651)。不过我没用过ruby,不能直接测试,也不清楚是不是真的如此,或者这个问题已经被修复,有测试过的朋友请一定告诉我。
(取自https://www.zybuluo.com/babydragon/note/225651 懂一点TCP是多么的必要)