我想知道HTTP上的POST方法是否将数据作为QueryString发送,或者它是否使用特殊结构将数据传递给服务器。
事实上,当我分析从客户端到服务器的POST方法的通信时(例如,使用Fiddler),我看不到任何QueryString,而是看到具有名称/值对的Form Body上下文。
答案 0 :(得分:50)
可视化的最佳方法是使用像Wireshark和follow the TCP stream这样的数据包分析器。 HTTP只是使用TCP从几行HTTP头开始发送数据流。这些数据通常很容易阅读,因为它包含HTML,CSS或XML,但它可以是通过互联网传输的任何类型的数据(可执行文件,图像,视频等)。
对于GET请求,您的计算机会请求特定的URL,并且Web服务器通常会响应200状态代码,并且在HTTP响应标头之后直接发送网页的内容。此内容与您在浏览器中查看网页来源时看到的内容相同。您提到的查询字符串只是URL的一部分,并包含在您的计算机发送到Web服务器的HTTP GET请求标头中。下面是对http://accel91.citrix.com:8000/OA_HTML/OALogout.jsp?menu=Y的HTTP GET请求的示例,后面是来自服务器的302重定向响应。由于查看窗口的大小(这些实际上每个只占用一行),一些HTTP标头被包装,而302重定向包括一个简单的HTML网页,其中包含指向重定向网页的链接(大多数浏览器将自动重定向任何302响应到Location头中列出的URL而不是显示HTML响应):
对于POST请求,您可能仍然有一个查询字符串,但这并不常见,并且与您正在POST的数据没有任何关系。相反,数据直接包含在浏览器发送到服务器的HTTP标头之后,类似于Web服务器用于响应GET请求的200响应。在POST一个简单的Web表单的情况下,这个数据是查询字符串使用的encoded using the same URL encoding,但是如果您使用的是SOAP Web服务,它也可以使用multi-part MIME format and XML data进行编码。
例如,这里是位于http://192.168.24.23:8090/msh的基于XML的SOAP Web服务的HTTP POST在Wireshark Follow TCP Stream中的样子:
答案 1 :(得分:20)
Post使用邮件正文将信息发送回服务器,而Get则使用查询字符串(问号后面的所有内容)。可以在同一个请求中发送Get查询字符串和Post消息体,但这可能会有点混乱,因此最好避免。
通常,最佳实践要求您在要检索数据时使用Get,并在要更改数据时使用Post。 (这些规则并不是一成不变的,规范并不禁止使用Get更改数据,但通常会避免因为您不希望人们仅通过单击链接或键入URL来进行更改)
相反,您可以使用Post来检索数据而不更改它,但使用Get意味着您可以为页面添加书签,或与其他人共享URL,如果您使用过Post则无法执行的操作。
至于在邮件正文中发送的数据的实际格式,这完全取决于发件人,并使用Content-Type
标头指定。如果未指定,则HTML表单的默认内容类型为application/x-www-form-urlencoded
,这意味着服务器将期望帖子正文是以与GET查询字符串类似的方式编码的字符串。然而,在所有情况下都不能依赖于此。 RFC2616在Content-Type标题上说明如下:
包含实体主体的任何HTTP / 1.1消息应该包含一个
Content-Type标头字段,用于定义该主体的媒体类型。如果
并且只有当Content-Type字段没有给出媒体类型时, 收件人可以通过检查媒体类型来尝试猜测媒体类型 用于标识
的URI的内容和/或名称扩展名 资源。如果媒体类型仍然未知,则收件人应该是 将其视为“application / octet-stream”类型。
答案 2 :(得分:17)
POST请求可以 包含查询字符串,但通常情况下它不会 - 带有POST操作的标准HTML表单通常不会包含查询字符串。
答案 3 :(得分:4)
GET会将数据作为查询字符串发送,但POST不会。相反,它会将其发送到请求的正文中。
答案 4 :(得分:1)
如果您的帖子尝试访问以下网址
mypage.php?ID = 1
你将拥有POST数据,但也有GET数据。