HTTP请求方法的有效载荷


68

HTTP上Wikipedia条目列出了以下HTTP请求方法:

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

我有兴趣了解(特别是关于前五个方法):

  • 这些方法中的哪一个能够(应该?)接收有效载荷
    • 可以接收有效载荷的方法中,它们如何接收?
      • 通过URL中的查询字符串?
      • 通过URL编码的正文?
      • 通过原始/分割的身体?
      • 通过以上([全部/部分]的组合)?

感谢您的所有投入,如果您可以分享一些(最好是轻度的)阅读,那太好了!

Answers:


32

RFC 7231(HTTP 1.1语义和内容)是HTTP方法语义的最新信息和权威信息。该规范表明,GET,HEAD,OPTIONS或CONNECT消息中可能包含的有效载荷没有定义的含义。第4.3.8节指出,客户不得发送TRACE请求的正文。因此,只有TRACE不能拥有有效负载,但是GET,HEAD,OPTIONS和CONNECT可能不会,并且如果客户端发送一个,则服务器不希望知道如何处理它(意味着它可以忽略它)。

如果您认为有任何歧义,可以在邮件列表中表达您的疑虑。


我仍然必须更详细地阅读它,但似乎HTTPBis草案已进入我希望知道的那种细节。谢谢!
Alix Axel

我不确定“最权威”,因为它们仍然是随时可能更改的草稿。不过,我同意它们对澄清RFC 2616中的歧义很有用。–
Matt Kantor

90

这是RFC 7231的摘要,该更新是发布的链接@Darrel的更新版本:

  • HEAD-没有定义的主体语义。
  • GET-没有定义的主体语义。
  • PUT-身体支持。
  • POST-身体支持。
  • DELETE-没有定义的主体语义。
  • 跟踪-支持正文
  • 选项-正文受支持,但没有用法的语义(可能在将来)。
  • CONNECT-没有定义的主体语义

就像@John也提到的那样,所有请求方法都支持URL中的查询字符串(一个值得注意的例外可能是OPTIONS,如果URL为,则仅在[在我的测试中]很有用HOST/*)。

我没有测试CONNECTPATCH方法,因为我对它们的ATM没有兴趣。


1
OPTIONS采用与任何其他方法相同的URI集,然后应用于资源。它仅适用于“ *”。
朱利安·雷施克

Connect可以有有效载荷吗?
CMCDragonkai 2013年

@CMCDragonkai:“ CONNECT请求上的实体没有定义的语义。请注意,在CONNECT请求上发送主体可能会导致某些现有实现拒绝该请求”。
Alix Axel

@AlixAxel您可以将缺少的WebDAV动词添加到列表中吗?还不够详尽,无法成为公认的答案。
2016年

PUT请求中的主体不是强制性的吗?应该封装一个资源完整表示,它将替换给定URI处的资源。
凯夫

3

我很确定还不清楚GET请求是否可以包含有效负载。GET请求通常通过查询字符串发布表单数据,与HEAD请求相同。HEAD本质上是GET-除非它不需要响应主体。

(旁注:我说不清楚,因为GET请求可以从技术上升级到另一个协议;实际上,一个版本的websockets做到了这一点,虽然某些代理软件可以很好地工作,但其他的握手协议却令人cho舌。)

POST通常具有主体。没有什么可以阻止您使用查询字符串,但是POST正文通常会在POST中包含表单数据。

有关更多(更详细)的信息,请参阅实际的HTTP / 1.1规范


当我说有效负载时,我还指的是在URL中执行的数据作为查询字符串。我知道可以POST通过URL编码的正文和/或URL查询字符串获得有效载荷。GET通过URL查询字符串支持负载,我认为两者同样的情况HEADDELETE,但我肯定不是100%这一点。我阅读了HTTP / 1.1 RFC的第9节,但对我来说似乎不太清楚。
Alix Axel

3
尚不清楚DELETE请求是否可以具有主体。但是,HTTP / 1.1 RFC中没有任何内容禁止它。而且,还有,查询字符串可以在任何要求,不只是GETHEAD以及DELETE-表单数据发布到身体的事实POST和查询字符串GET可能比什么都更HTML相关。
约翰·查德威克

3
在Httpbis中清楚地阐明了在DELETE工具中发送正文的含义。ietf.org / html / draft-ietf-httpbis-p2-semantics-14#page-20这并不意味着任何东西,并且有些东西已经存在互联网组件可能会拒绝它。GET也是如此。
Darrel Miller

@达雷尔·米勒(Darrel Miller):好的,我不知道。
约翰·查德威克

2
Httpbis规范的目的是澄清RFC2616忘记说或不好说的内容。
Darrel Miller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.