一尘不染

带有请求正文的 HTTP GET

javascript

我正在为我们的应用程序开发一个新的 RESTful web 服务。

在对某些实体执行 GET 时,客户端可以请求实体的内容。如果他们想添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数。

或者,我希望人们能够在请求正文中指定这些参数。 HTTP/1.1似乎没有明确禁止这一点。这将允许他们指定更多信息,可能更容易指定复杂的 XML 请求。

我的问题:

这完全是个好主意吗?
HTTP 客户端会在 GET 请求中使用请求正文时遇到问题吗?


阅读 261

收藏
2022-01-30

共1个答案

一尘不染

是的。换句话说,任何 HTTP 请求消息都被允许包含消息体,因此必须考虑到这一点来解析消息。但是,GET 的服务器语义受到限制,因此主体(如果有)对请求没有语义意义。解析的要求与方法语义的要求是分开的。

所以,是的,您可以使用 GET 发送正文,但不,这样做从来没有用处。

这是 HTTP/1.1 分层设计的一部分,一旦规范被划分(正在进行中),它将再次变得清晰。

是的,您可以使用 GET 发送请求正文,但它应该没有任何意义。如果您通过在服务器上解析它并根据其内容更改响应来赋予它意义,那么您将忽略HTTP/1.1 规范第 4.3 节中的此建议:

…如果请求方法不包括为实体主体定义的语义,则在处理请求时应该忽略消息主体。

以及HTTP/1.1 规范第 9.3 节中对 GET 方法的描述:

GET 方法意味着检索由 Request-URI 标识的任何信息([…])。

它指出请求正文不是 GET 请求中资源标识的一部分,只是请求 URI。

更新

被称为“HTTP/1.1 规范”的 RFC2616 现已过时。2014 年,它被 RFC 7230-7237 取代。引用“处理请求时应该忽略消息正文”已被删除。现在只是“请求消息框架独立于方法语义,即使该方法没有定义消息体的任何用途”第二个引用“GET 方法意味着检索任何信息……由 Request-URI 标识”被删除。- 来自评论

HTTP 1.1 2014 规范

GET 请求消息中的有效负载没有定义的语义;在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。

2022-01-30