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

kwi*_*chz 52 html post http

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

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

Gre*_*ray 52

可视化的最佳方法是使用像Wireshark这样的数据包分析器并遵循TCP流.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响应):

具有302重定向的HTTP GET

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

例如,以下是位于http://192.168.24.23:8090/msh的基于XML的SOAP Web服务的HTTP POST 在Wireshark中跟随TCP流的情况:

HTTP POST TCP流


Gor*_*onM 23

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头部字段.如果
且仅当介质类型不是由内容类型字段中给出的
接收方可能试图通过它的检验猜测的媒体类型
的内容和/或URI的扩展名(S)用于标识
资源.如果媒体类型仍然未知,则收件人应该
将其视为"application/octet-stream"类型.


Jus*_*tin 18

POST请求可以包含查询字符串,但通常情况下它不会 - 具有POST操作的标准HTML表单通常不会包含查询字符串.


ata*_*ini 5

GET 会将数据作为查询字符串发送,但 POST 不会。相反,它将在请求正文中发送。