关于HTTP GET 和 POST

刚刚看到了这这一篇文章, 其中有一个"很有意思"的观点 (这里暂且不管两个数据包两个步骤之间的区别. 其实文中数据包这个说法也是有问题的)

GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
老刘:99%的人都理解错了HTTP中GET与POST的区别zhuanlan.zhihu.com图标


看到这里我不仅倒吸一口凉气, 难道是我以前都把RFC理解错了吗? 为了一探究竟, 在这里我们来看一看RFC的原文


RFC 7231 中对HTTP POST描述在 4.3.3 节

Hypertext Transfer Protocol (HTTP/1.1): Semantics and Contenttools.ietf.org

在此章节中并没有提到Server需要收到header了以后需要返回100 continue的信息.


那么我们再来看看HTTP Status 100的Spec. 节选自 RFC 7231 Section 6.2.1

6.2.1. 100 Continue

The 100 (Continue) status code indicates that the initial part of a
request has been received and has not yet been rejected by the
server. The server intends to send a final response after the
request has been fully received and acted upon.

When the request contains an Expect header field that includes a
100-continue expectation, the 100 response indicates that the server
wishes to receive the request payload body, as described in
Section 5.1.1. The client ought to continue sending the request and
discard the 100 response.

If the request did not contain an Expect header field containing the
100-continue expectation, the client can simply discard this interim
response.

大意是Status Code 100 表示服务器对客户端请求的开头部分的回应,大概的意思是"我已经收到了,请继续". 但是这并不表明服务器需要接受请求, 服务器是否接受请求还要看接下来客户端发送的数据.

注意第二段明确地提到 如果HTTP请求中有 Expect header包含"100-continue", 那么服务器返回"100-continue"表明服务器愿意接受接下来的请求.

通俗地讲, 就是客户端必须在请求头里明确地指定"我需要一个请继续的回执", 这时候服务器发送"请继续"才表示服务器会继续接受这个请求.

我们再来看一下Section 5.1.1 关于Except Header部分的介绍, 其中也并没有提到任何关于100 Status只能用于POST的内容给. 相反地,RFC中给出的例子是PUT Method:

For example, a request that begins with

PUT /somewhere/fun HTTP/1.1
Host: http://origin.example.com
Content-Type: video/h264
Content-Length: 1234567890987
Expect: 100-continue


allows the origin server to immediately respond with an error
message, such as 401 (Unauthorized) or 405 (Method Not Allowed),
before the client starts filling the pipes with an unnecessary data
transfer.

依据RFC的内容, 这个PUT请求同样也可以分两次发送给服务器.

Hypertext Transfer Protocol (HTTP/1.1): Semantics and Contenttools.ietf.org



结论: 那篇文章中关于POST区别的说法并不成立, 100 Continue并不是POST Method中的一个步骤,并且也不仅仅只能用于POST method

最后希望各位在科普的时候,抱着认真负责的态度....


以上.

编辑于 2018-06-19