HTTP POST方法是否将数据作为QueryString发送?

我想知道HTTP上的POST方法是将数据作为QueryString发送,还是使用特殊的结构将数据传递给服务器。

实际上,当我分析从客户端到服务器的POST方法的通信(例如Fiddler)时,我没有看到任何QueryString,而是具有名称/值对的Form Body上下文。

想象这个最好的方法是使用像Wireshark这样的数据包分析器,并遵循TCPstream 。 HTTP只需使用TCP从几行HTTP头开始发送数据stream。 通常这些数据很容易阅读,因为它由HTML,CSS或XML组成,但它可以是通过互联网(可执行文件,图像,video等)传输的任何types的数据。

对于GET请求,您的计算机请求特定的URL,并且Web服务器通常以200状态代码进行响应,并且在HTTP响应标头之后直接发送网页内容。 如果您在浏览器中查看网页的来源,则此内容与您会看到的内容相同。 您提到的查询string只是URL的一部分,并被包含在您的计算机发送到Web服务器的HTTP GET请求标头中。 以下是http://accel91.citrix.com:8000/OA_HTML/OALogout.jsp?menu=Y的HTTP GET请求示例,后面是来自服务器的302redirect响应。 某些HTTP头由于查看窗口的大小而被封装(这些实际上只占用一行),而302redirect包括一个简单的HTML网页,其中包含指向redirect网页的链接(大多数浏览器将自动redirect任何302响应到位置标题中列出的URL,而不是显示HTML响应):

使用302重定向的HTTP GET

对于POST请求,您可能仍然有一个查询string,但这是不常见的,并且与您正在发布的数据没有任何关系。 而是将数据直接包含在浏览器发送到服务器的HTTP标头之后,类似于Web服务器用于响应GET请求的200响应。 在POST一个简单的Web表单的情况下,这个数据使用与查询string相同的URL编码进行编码 ,但是如果您使用SOAP Web服务,则也可以使用多部分MIME格式和XML数据进行编码。

例如,这里是一个基于XML的SOAP Web服务的HTTP POST,位于http://192.168.24.23:8090/msh,看起来像在Wireshark中遵循TCP Stream :

HTTP POST TCP流

Post使用消息正文将信息发送回服务器,而不是使用查询string的Get(问号后面的所有内容)。 可以在同一个请求中同时发送一个Get查询string和一个Post消息正文,但这可能会让人困惑,所以最好避免。

一般来说,最佳实践决定了当您想要检索数据时使用Get,而当您想要更改时使用Post。 (这些规则并不是一成不变的,规范并不禁止使用Get来更改数据,但通常可以避免,因为您不希望人们通过单击链接或inputURL来进行更改)

相反,您可以使用Post来检索数据而不更改它,但是使用Get意味着您可以为页面添加书签,或者与其他人共享URL,如果您使用Post则无法完成。

一个POST请求可以包含一个查询string,但通常情况下它不会 – 带POST操作的标准HTML表单通常不会包含查询string。

GET将发送数据作为查询string,但POST不会。 而是将它发送到请求的正文中。

如果您的post尝试访问以下url

mypage.php?ID = 1

您将拥有POST数据,但也有GET数据。