HTTP GET 和 POST 请求的网络通信有什么不同吗?
使用 GET,我知道整个请求是一次性发送的。使用 POST,我认为发送了初始请求,然后发送了第二个请求,该请求发送了所有参数。
例如,假设服务器和客户端之间的延迟是 500 毫秒。GET 与 POST 调用的总时间是多少?
HTTP GET 和 POST 请求的网络通信有什么不同吗?
使用 GET,我知道整个请求是一次性发送的。使用 POST,我认为发送了初始请求,然后发送了第二个请求,该请求发送了所有参数。
例如,假设服务器和客户端之间的延迟是 500 毫秒。GET 与 POST 调用的总时间是多少?
报文都是TCP报文,携带HTTP协议,请求方式不会改变网络层的响应时间。
它会根据请求的大小在请求到请求的基础上发生变化,但这不是由请求类型决定的。
您可以通过 post 发送比 get 更多的数据,但这并不意味着他们响应更快,这是一个单独的问题。
HTTP 服务器处理和返回结果的速度取决于您使用的服务器,而且可能微不足道,不值得一提。
从服务器返回结果的速度取决于 HTTP 服务器正在处理什么资源,如果它调用一个需要时间的 PHP 文件,那么它将需要时间......
数据包没有明显的区别......这是通过 SSL 的 GET 请求:
00907f8252f7001e4fe86a93080045000028
0bb2400080067380ac100167adc22064c51a
01bb66ccad148448d84850103f05bde90000
这是一个通过 SSL 的 POST 请求:
00907f8252f7001e4fe86a93080045000028
0c0640008006732cac100167adc22064c511
01bbe538c0df8621dc6150104042248c0000
TCP数据包中的字符串是“GET”还是“POST”并没有太多的参与,网络看着它,说“哦,你是TCP,嗯?好吧,那你走吧。 " 它不在乎。
由于服务器级别的处理或正在处理的代码,正常网络流量之外的任何延迟都是唯一的。
给定相同数量的信息(POST 消息不超过 GET),从技术上讲,POST 在服务器端应该更快(纳秒到皮秒):
POST 请求不记录查询字符串,因此写入处理较少。服务器 IOPS 可能会无意中影响延迟
没有这个,给定相同的数据包,它们实际上是等效的。
GET 将数据存储在查询字符串中,POST 将信息存储在消息正文中。
服务器处理两者,只是方式不同。
在客户端,POST 需要更多处理来准备消息。如果执行任何 AJAX,您会注意到这一点,发送 GET 请求比发送 POST 容易得多。
正如 w3 在HTTP/1.1上定义的那样,GET 能够执行部分请求,从而限制了网络带宽:
如果请求消息包含 Range 标头字段,则 GET 方法的语义更改为“部分 GET”。部分 GET 请求仅传输实体的一部分,如第 14.35 节所述。部分 GET 方法旨在通过允许完成部分检索的实体而不传输客户端已经持有的数据来减少不必要的网络使用。
此外,w3 描述了一个有条件的 GET 来减少网络使用:
如果请求消息包含 If-Modified-Since、If-Unmodified-Since、If-Match、If-None-Match 或 If-Range 头字段,则 GET 方法的语义更改为“条件 GET”。条件 GET 方法请求仅在条件头字段描述的情况下传输实体。条件 GET 方法旨在通过允许刷新缓存的实体而不需要多个请求或传输客户端已经持有的数据来减少不必要的网络使用。
我在 Wireshark 中监控时对此进行了测试。
我创建了一个简单的 HTML 表单并在 GET 和 POST 之间切换方法。
始终如一地,我注意到 GET 请求发送一个数据包,而 POST 发送两个。即使表单数据非常小,POST 数据也总是在第二个数据包中发送。
这向我表明 POST 会受到延迟的更大影响。
更新 2011.07.05:
这是 POST 的简单 HTML 表单:
<form method="GET" action="/form-handler.aspx">
<input type="hidden" value="12345" />
<input type="submit" value="click to submit" />
</form>
这是 POST 版本:
<form method="POST" action="/form-handler.aspx">
<input type="hidden" value="12345" />
<input type="submit" value="click to submit" />
</form>
对于给定的数据,它们可能非常接近。以下是 GET 请求的样子:
GET /test?x=5&y=3&z=4 HTTP/1.1
Header1: value
Header2: value
...
以下是与 POST 相同的外观:
POST /test HTTP/1.1
Header1: value
Header2: value
...
x=5&y=3&z=4
所以它是相同数量的数据。真正的问题是您是否希望用户能够添加书签并返回到 URL 并在将来再次看到相同的数据。GET 用于此目的,POST 用于请求在服务器上更改数据,或出于安全原因(例如,不要使用 GET 提交密码)。
乔纳森的回答非常清楚。但是,让我在请求彼此不同的地方走得更远。
通过互联网流动的所有信息都通过小包裹。假设每个包的最大容量为 1KB(这不是正确的值,它只是为了澄清机制,如果您想要有关限制的真实值,请在 RFC 上搜索)。
好的,所以我们有一个 GET 和一个 POST 请求。这些包与 Jonathan 说明的非常相似。在这种情况下,只要少量的数据,所有的东西都可以被包裹在 1KB 的包中,因此网络性能没有什么不同。
但是如果请求需要很大怎么办?少数人知道,但 GET 请求的最大长度可能因服务器而异。尝试询问任何 site.com/foo/a{200 次 A}。它将返回一个无效/错误的请求,而不仅仅是一个 404 未找到。
所以这里是 POST 发生的地方。如果数据量大于某个值,POST 允许服务器继续列出该请求并解析这些值。
之前没有提到的行为还有另一个潜在的差异。POST 数据在浏览器中解析为当前文档编码,然后发送到服务器。
这一切都与客户端的实施有关。在 http 规范中没有这样的条件。发送时间取决于数据量。如果您仅使用 POST 来替换 GET,它将无法区分。