使用请求体的HTTP GET请求
使用请求体的HTTP GET请求
我正在为我们的应用程序开发一个新的RESTful webservice。
当获取某些实体时,客户端可以请求实体的内容。
如果他们想要添加一些参数(例如对列表进行排序),他们可以将这些参数添加到查询字符串中。
或者,我希望人们能够在请求正文中指定这些参数。
HTTP/1.1似乎并没有明确禁止这样做。这将允许他们指定更多信息,可能会使指定复杂的XML请求变得更容易。
我的问题是:
- 总的来说,这是个好主意吗?
- HTTP客户端在使用GET请求时使用请求正文会有问题吗?
https://www.rfc-editor.org/rfc/rfc2616
Roy Fielding对于在GET请求中包含请求体的评论。
是的。换句话说,任何HTTP请求消息都允许包含消息体,并且必须考虑解析带有消息体的消息。GET的服务器语义是受限的,因此请求中的消息体(如果有)对请求没有语义意义。解析的要求不同于方法语义上的要求。
所以,您可以在GET中发送请求体,但没有任何用处。
这是HTTP/1.1的分层设计的一部分,一旦规范被分割(正在进行中),这一点将再次变得清晰。
....罗伊
是的,您可以使用GET发送请求体,但不应该有任何含义。如果您在服务器上解析请求体并根据其内容更改响应,则正在忽略HTTP/1.1规范第4.3节中的建议:
... 如果请求方法不包括实体主体的定义语义,则在处理请求时应忽略消息主体。
以及在HTTP/1.1规范第9.3节中对GET方法的描述:
GET方法表示检索由请求URI标识的任何信息([...])
其中规定,在 GET 请求中,请求体不是资源标识的一部分,只有请求 URI 是标识。
更新:被称为“HTTP/1.1 规范”的 RFC2616 现已过时。在2014年,它被 RFC7230-7237 替换。引用中的“处理请求时应忽略消息体”被删除。现在只有“即使方法未定义消息体的用途,请求消息的排版也是独立于方法语义的。” 第二个引用 “GET 方法表示检索由请求 URI 标识的所有信息…” 已被删除。 —— 来自评论
从 2014 年的 HTTP 1.1 规范 中可以看到:
在 GET 请求消息中的有效载荷没有定义的语义;在 GET 请求上发送有效载荷体可能会导致某些现有的实现拒绝该请求。