简短回答: 在 POST 请求中,值在请求的“正文”中发送。对于网络表单,它们最有可能使用application/x-www-form-urlencoded 或multipart/form-data 的媒体类型发送。设计用于处理网络请求的编程语言或框架通常对此类请求执行“正确的事情™”,并为您提供对易于解码的值的轻松访问(如 PHP 中的 $_REQUEST 或 $_POST 或 @987654334 @, flask.request.form 在 Python 中)。
现在让我们离题一点,这可能有助于理解其中的区别;)
GET 和 POST 请求之间的区别主要是语义上的。它们的“使用”方式也不同,这解释了值传递方式的差异。
在执行GET 请求时,您向服务器请求一个或一组实体。为了允许客户端过滤结果,它可以使用 URL 的所谓“查询字符串”。查询字符串是? 之后的部分。这是URI syntax 的一部分。
因此,从您的应用程序代码(接收请求的部分)的角度来看,您将需要检查 URI 查询部分以访问这些值。
请注意,键和值是 URI 的一部分。浏览器可能对 URI 长度施加限制。 HTTP 标准声明没有限制。但在撰写本文时,大多数浏览器确实限制了 URI(我没有具体的值)。 GET 请求应该永远用于向服务器提交新信息。特别是不是更大的文件。这就是你应该使用POST 或PUT 的地方。
当执行POST 请求时,客户端实际上是在向远程主机提交一个新的文档。因此,query 字符串(在语义上)没有意义。这就是您无法在应用程序代码中访问它们的原因。
POST 稍微复杂一点(方式更灵活):
当接收到一个 POST 请求时,您应该总是期待一个“有效负载”,或者,用 HTTP 术语来说:message body。消息体本身没什么用,因为没有标准(据我所知。也许是application/octet-stream?)格式。正文格式由Content-Type 标头定义。当使用带有method="POST" 的HTML FORM 元素时,这通常是application/x-www-form-urlencoded。如果您使用文件上传,另一种非常常见的类型是multipart/form-data。但它可能是任何东西,范围从text/plain、application/json 甚至是自定义的application/octet-stream。
在任何情况下,如果 POST 请求是由应用程序无法处理的 Content-Type 发出的,它应该返回一个 415 status-code。
大多数编程语言(和/或网络框架)都提供了一种将消息正文从最常见类型(如application/x-www-form-urlencoded、multipart/form-data 或application/json)解码/编码的方法。所以这很容易。自定义类型可能需要更多的工作。
以标准的 HTML 表单编码文档为例,应用程序应执行以下步骤:
- 阅读
Content-Type 字段
- 如果该值不是受支持的媒体类型之一,则返回带有
415 状态代码的响应
- 否则,解码消息正文中的值。
同样,PHP 等语言或其他流行语言的网络框架可能会为您处理这个问题。对此的例外是415 错误。没有框架可以预测您的应用程序选择支持和/或不支持哪些内容类型。这取决于你。
PUT 请求的处理方式与POST 请求的处理方式几乎相同。最大的区别在于POST 请求应该让服务器决定如何(如果有的话)创建新资源。从历史上看(从现在已经过时的 RFC2616 开始,它是创建一个新资源作为请求发送到的 URI 的“从属”(子)。
相比之下,PUT 请求应该将资源准确地“存放”在该 URI 处,并且准确地 使用该内容。不多也不少。这个想法是 client 负责在“PUT”之前制作 complete 资源。服务器应该在给定的 URL 上按原样接受它。
因此,POST 请求通常不用于替换现有资源。 PUT 请求可以同时创建和替换。
旁注
还有“path parameters”可以用来向远程发送额外的数据,但它们太少见了,我在这里不再赘述。但是,作为参考,这里是 RFC 的摘录:
除了层次路径中的点段之外,还考虑了路径段
通过通用语法不透明。生成 URI 的应用程序经常使用
段中允许的保留字符来分隔特定于方案的或
取消引用处理程序特定的子组件。例如,分号 (";")
和等号 ("=") 保留字符通常用于分隔参数和
适用于该段的参数值。逗号 (",") 保留
字符通常用于类似目的。例如,一个 URI 生产者
可以使用诸如“name;v=1.1”之类的段来指示对版本的引用
"name" 的 1.1,而另一个可能使用诸如 "name,1.1" 之类的段来
表示相同。参数类型可以由特定于方案的定义
语义,但在大多数情况下,参数的语法是特定的
到 URI 解引用算法的实现。