HTTP请求方法的有效载荷

71

HTTP的维基百科页面列出了以下HTTP请求方法:

  • HEAD: 请求与GET请求相同的响应,但不包括响应正文。
  • GET: 请求指定资源的表示形式。
  • POST: 将数据(例如来自HTML表单的数据)提交给标识的资源进行处理。 数据包含在请求的正文中。
  • PUT: 上传指定资源的表示形式。
  • DELETE: 删除指定的资源。
  • TRACE: 回显已收到的请求,以便客户端可以查看中间服务器所做的任何更改或添加。
  • OPTIONS: 返回服务器支持指定URL的HTTP方法。这可用于通过请求“*”而不是特定资源来检查Web服务器的功能。
  • CONNECT: 将请求连接转换为透明的TCP / IP隧道,通常是为了通过未加密的HTTP代理便于SSL加密通信(HTTPS)。
  • PATCH: 用于对资源应用部分修改。

我想知道(特别是前五个方法):

  • 这些方法中有哪些能够(应该?)接收有效载荷
    • 能够接收有效负载的方法如何接收它?
      • 通过URL中的查询字符串?
      • 通过URL编码的正文?
      • 通过原始/分块正文?
      • 通过以上所有/某些方式的组合?

我感谢所有的回答,如果您能分享一些(最好是简单易懂的)阅读材料,那就太好了!

3个回答

94
这是从RFC 7231中提取的摘要,这是链接@Darrel发布的更新版本:
  • HEAD - 没有定义的主体语义。
  • GET - 没有定义的主体语义。
  • PUT - 支持主体。
  • POST - 支持主体。
  • DELETE - 没有定义的主体语义。
  • TRACE - 不支持主体。
  • OPTIONS - 支持主体,但没有关于使用的语义(可能在未来)。
  • CONNECT - 没有定义的主体语义
正如@John也提到的,所有请求方法都支持URL中的查询字符串(一个值得注意的例外可能是OPTIONS,它似乎只有在URL为HOST/*时才有用)。
我没有测试CONNECTPATCH方法,因为我目前对它们不感兴趣。

1
OPTIONS命令与其他方法一样,接受相同的URI集合,然后应用于该资源。它只对“”特殊。 - Julian Reschke
连接可以有有效载荷吗? - CMCDragonkai
@CMCDragonkai:“在CONNECT请求中,请求体没有定义的语义。请注意,在CONNECT请求中发送请求体可能会导致某些现有的实现拒绝该请求。” - Alix Axel
@AlixAxel,你能否将缺失的WebDAV动词添加到列表中吗?目前它还不够详尽以成为被接受的答案。 - Knu
在PUT请求中,请求体不是必需的吗?它应该封装一个资源的完整表示形式,以替换给定URI处的资源。 - Kev

35

RFC 7231是关于HTTP方法语义方面最权威的参考资料,它指出在GET、HEAD、OPTIONS或CONNECT消息中包含的负载没有定义的意义。第4.3.8节规定客户端不得为TRACE请求发送负载。因此,只有TRACE请求不能包含负载,但GET、HEAD、OPTIONS和CONNECT请求可能也不会包含负载,而且服务器不会对其进行处理(这意味着可以忽略它)。

如果您认为任何内容存在歧义,可以通过邮件列表表达您的担忧。


我还需要更详细地阅读它,但HTTPBis草案似乎涉及到我希望了解的那些细节。谢谢! - Alix Axel
我不确定“最权威”的说法,因为它们仍然是可能会更改的草案。尽管如此,我同意它们在澄清RFC 2616中的歧义方面非常有用。 - Matt Kantor
FYI:RFC 7231已被RFC 9110所取代。但是,不确定它是否改变了语义。 - isaias-b
关于 TRACE 的章节现在是 9.3.8,仍然在结尾处包含“MUST NOT 发送内容”的部分。 - isaias-b

3
我相信大家并不清楚GET请求是否可以携带有效载荷。通常,GET请求通过查询字符串提交表单数据,HEAD请求也是如此。HEAD本质上与GET相同——只是它不需要响应正文。
(副注:我之所以说不清楚,是因为GET请求理论上可以升级到另一个协议;事实上,websockets的某个版本就是这样做的,虽然某些代理软件可以正常工作,但其他代理软件则在握手时出现了问题。)
POST通常有一个正文。你可以使用查询字符串,但POST正文通常包含POST中的表单数据。
要获取更多(更详细)信息,请访问实际的HTTP / 1.1规范

当我说载荷时,也指URL中作为查询字符串传递的数据。我知道“POST”通过URL编码的正文和/或URL查询字符串来接收负载。GET支持通过URL查询字符串进行负载,并且我认为HEADDELETE也是相同的,但我不能百分之百确定。我阅读了HTTP / 1.1 RFC的第9节,但对我来说并不是很清楚。 - Alix Axel
3
目前并不清楚DELETE请求是否可以带有消息体。然而,HTTP/1.1 RFC中没有明确禁止这一点。另外,查询字符串可以在任何请求中出现,不仅限于GETHEADDELETE。而POST中的表单数据被放在消息体内,而GET中则是放在查询字符串中,可能更多与HTML相关,与其他因素无关。 - John Chadwick
3
在Httpbis中非常清楚地解释了以DELETE方式发送正文的含义,但这并没有意义,一些现有的互联网组件可能会拒绝它。 GET也是同样的情况。 - Darrel Miller
@Darrel Miller:哦,好的,我不知道那个。 - John Chadwick
2
Httpbis规范的目标是澄清RFC2616遗漏或表述不清的内容。 - Darrel Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接