HTTP GET和POST请求的网络通信有什么不同吗?
通过GET,我了解整个请求是一次性发送的。 使用POST,我认为发送了初始请求,然后发送了第二个发送所有参数的请求。
例如,假设服务器和客户端之间的延迟为500毫秒。 GET与POST通话的总时间是多少?
答案 0 :(得分:8)
数据包都是TCP数据包,它携带HTTP协议,请求方法不会改变网络层的响应时间。
它会根据请求的大小而根据请求的大小进行更改,但这不是由请求类型决定的。
您可以使用post发送更多数据而不是get,但这并不意味着它们响应更快,这是一个单独的问题。
HTTP服务器可以处理并返回结果的速度在您正在使用的服务器上,并且可能是如此微不足道,因此不值得一提。
结果从服务器返回的速度取决于HTTP服务器正在处理的资源,如果它调用需要时间的PHP文件,则需要时间......
数据包没有明显的区别......这是通过SSL的GET请求:
00907f8252f7001e4fe86a93080045000028
0bb2400080067380ac100167adc22064c51a
01bb66ccad148448d84850103f05bde90000
这是通过SSL的POST请求:
00907f8252f7001e4fe86a93080045000028
0c0640008006732cac100167adc22064c511
01bbe538c0df8621dc6150104042248c0000
TCP数据包中的字符串是“GET”还是“POST”并没有太多参与,网络看着它,说“哦,你是TCP,嗯?好吧,关闭你那就去吧。”它并不关心。
正常网络流量之外的任何延迟都是由于在服务器级别上处理或者正在处理的代码而导致的。
答案 1 :(得分:7)
鉴于相同数量的信息(POST消息不超过GET),POST在服务器端技术上应该更快(纳秒到皮秒):
POST请求不记录查询字符串,因此写入处理较少。服务器IOPS可能会无意中影响延迟
如果没有这个,给定相同的数据包,它们实际上是等价的。
GET将数据存储在查询字符串中,POST将信息存储在消息体中
服务器以不同的方式处理两者。
在客户端,POST需要更多处理来准备消息。如果做任何AJAX,你会注意到这一点,发送GET请求要比POST容易得多。
根据HTTP/1.1上的w3定义,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方法旨在通过允许刷新缓存的实体而不需要多个请求或传输客户端已经拥有的数据来减少不必要的网络使用。
答案 2 :(得分:1)
对于给定的数据,它们可能几乎相同。以下是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提交密码)。
答案 3 :(得分:1)
Jonathan的回答非常明确。但是,请允许我在请求彼此不同的地方稍微进一步。
流经互联网的所有信息都通过小包装。假设每个包的最大容量为1KB(这不是正确的值,只是为了澄清机制,如果你想要关于限制的实际值,那就去搜索RFC)。
好的,我们有一个GET和一个POST请求。这些包与Jonathan所说的非常相似。在这种情况下,只需少量数据,一切都可以包装在1KB包内,因此网络性能没有差别。
但如果请求需要巨大呢?有些人知道,但GET请求的最大长度可能因服务器而异。尝试询问任何site.com/foo/a{200次A}。它将返回无效/错误请求,而不是仅找到404。
所以这里是POST发生的地方。如果数据量大于某个值,POST允许服务器继续列出该请求并解析值。
此外,之前未提及的行为存在另一个潜在的差异。在发送到服务器之前,POST数据在浏览器中被解析为当前文档编码。
答案 4 :(得分:1)
我在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>
答案 5 :(得分:0)
它完全是关于客户端的实现。在http规范中没有这样的条件。 发送时间取决于数据量。如果你只使用POST替换GET,那将是无法区分的。