一尘不染

带请求正文的HTTP GET

http

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

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

另外,我希望人们能够在请求正文中指定这些参数。 HTTP / 1.1似乎并未明确禁止这样做。这将使他们能够指定更多信息,可能使指定复杂的XML请求更加容易。

我的问题:

这是个好主意吗?
HTTP客户端在GET请求中使用请求主体时会遇到问题吗?
http://tools.ietf.org/html/rfc2616


阅读 522

收藏
2020-07-28

共1个答案

一尘不染

是。换句话说,任何HTTP请求消息都允许包含消息正文,因此必须在解析消息时牢记这一点。但是,GET的服务器语义受到限制,以使主体(如果有的话)对请求不具有语义。解析要求与方法语义要求分开。

因此,是的,您可以使用GET发送正文,否,这样做永远没有用。

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

....罗伊

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

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

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

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

声明请求主体不是GET请求中资源标识的一部分,仅是请求URI。

更新资料

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

根据HTTP 1.1 2014 Spec

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

2020-07-28