哪些HTTP方法需要正文?

哪些HTTP方法需要正文?,http,Http,一些HTTP方法,如POST,要求在头和双CRLF之后发送正文 其他的,例如GET,没有主体,对于它们来说,双CRLF标记请求的结束 但是其他的呢:放,删除。。。如何知道哪一个需要身体 通用HTTP客户端应该如何对未知HTTP方法作出反应?拒绝它?默认情况下需要实体,还是默认情况下不需要实体 如能提供相关规范的指针,将不胜感激 编辑:我将根据评论中的提问,详细说明我的问题 我正在设计一个通用HTTP客户端,程序员可以使用它向任何服务器发送任意HTTP请求 客户端可以这样使用(伪代码): 数据是

一些HTTP方法,如
POST
,要求在头和双
CRLF
之后发送正文

其他的,例如
GET
,没有主体,对于它们来说,双
CRLF
标记请求的结束

但是其他的呢:
删除
。。。如何知道哪一个需要身体

通用HTTP客户端应该如何对未知HTTP方法作出反应?拒绝它?默认情况下需要实体,还是默认情况下不需要实体

如能提供相关规范的指针,将不胜感激


编辑:我将根据评论中的提问,详细说明我的问题

我正在设计一个通用HTTP客户端,程序员可以使用它向任何服务器发送任意HTTP请求

客户端可以这样使用(伪代码):

数据是可选的,可以是原始数据(字符串),也可以是键/值对的关联数组

如果数据是一个数组,则库将对其进行url编码,然后将数据附加到url以进行
GET
请求,或者将其发送到消息体中以进行
POST
请求


因此,考虑到开发人员选择的HTTP方法,我试图确定此HttpClient是否必须/应该/不应该/不应该在请求中包含消息体。

编辑:编译列表:

  • 实体主体仅在存在消息主体时才存在(第7.2节)
  • 通过包含
    内容长度
    传输编码
    头(第4.3节)来表示消息正文的存在
  • 当请求方法的规范不允许发送实体正文时,不得包含消息正文(第4.3节)
  • 实体主体仅在跟踪请求中被明确禁止,所有其他请求类型均不受限制(第9节,特别是第9.8节)
对于响应,定义如下:

  • 是否包含消息正文取决于请求方法和响应状态(第4.3节)
  • 明确禁止在响应HEAD请求时使用消息体(第9节,特别是第9.4节)
  • 1xx(信息性)、204(无内容)和304(未修改)响应中明确禁止消息正文(第4.3节)
  • 所有其他响应都包括一个消息体,尽管它可能是零长度的(第4.3节)

(RFC 7231)或版本(来自IETF&更深入)是您想要的。根据RFC:

对于
放置

PUT方法要求将封闭的实体存储在 提供的请求URI。如果请求URI引用已存在的 资源,则应将封闭的实体视为已修改的实体 位于源服务器上的版本。如果请求URI 不指向现有资源,并且该URI能够 请求用户代理将其定义为新资源 源服务器可以使用该URI创建资源。如果有新的资源 创建时,源服务器必须通过201通知用户代理 (创建)响应。如果修改了现有资源,则 应发送200(正常)或204(无内容)响应代码以指示 成功完成请求。如果资源不可用 使用请求URI创建或修改,这是一个适当的错误 应作出反映问题性质的回应。这个 实体的收件人不得忽略任何内容-*(例如。 内容范围)它无法理解或实现的标题,以及 在这种情况下,必须返回501(未实现)响应

对于
删除

DELETE方法请求源服务器删除资源 由请求URI标识。此方法可能会被人工覆盖 在源服务器上进行干预(或其他方式)。客户不能 确保已执行操作,即使 从源服务器返回的状态代码表示该操作 已成功完成。但是,服务器不应该 表示成功,除非在给出响应时,它打算 删除资源或将其移动到无法访问的位置

如果响应中包含 描述状态的实体,202(已接受)(如果操作尚未完成) 已颁布,或204(无内容),如果行动已颁布,但 响应不包括实体

如果请求通过缓存并且请求URI标识 一个或多个当前缓存的实体,应处理这些条目 陈腐的。对此方法的响应不可缓存


对于任意方法,或者您不希望在服务器端支持的有效方法,HTTP状态代码405应发送回调用方

根据:

405方法不允许使用 该资源不支持请求方法;[2] 例如,使用 使用要求通过POST或使用 放在只读资源上


您可能需要阅读当前HTTP规范草案中关于消息正文长度的部分:

从您的评论中,我知道您正在编写一个HTTP客户端库(为什么,还不够?)。您想知道
方法的
数据是必需的还是禁止的

假设你的库的用户知道他们在做什么。如果我想发送一个带有GET请求的实体,我可以,因为规范并不禁止这样做。那么为什么你的图书馆要这样做呢

此外,HTTP规范在这方面是开放的;HTTP的扩展(如WebDAV)可以指定允许或不允许甚至需要消息体的新方法(动词)

HttpClient.request(method, url [, data]);
OPTIONS
GET
HEAD
POST
PUT
DELETE
CONNECT