使用请求体的HTTP GET请求

33 浏览
0 Comments

使用请求体的HTTP GET请求

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

当获取某些实体时,客户端可以请求实体的内容。

如果他们想要添加一些参数(例如对列表进行排序),他们可以将这些参数添加到查询字符串中。

或者,我希望人们能够在请求正文中指定这些参数。

HTTP/1.1似乎并没有明确禁止这样做。这将允许他们指定更多信息,可能会使指定复杂的XML请求变得更容易。

我的问题是:

  • 总的来说,这是个好主意吗?
  • HTTP客户端在使用GET请求时使用请求正文会有问题吗?

https://www.rfc-editor.org/rfc/rfc2616

admin 更改状态以发布 2023年5月22日
0
0 Comments

虽然你可以这样做,只要它不被HTTP规范明确禁止,但我建议避免这样做,因为人们不希望以这种方式工作。HTTP请求链中有许多阶段,虽然它们“大多数”符合HTTP规范,但你可以确信的是它们会像网络浏览器传统使用的方式一样运作。(我想到的是透明代理,加速器,音视频工具包等)

这是“健壮性原则”的精神,大致为“在接受方面要慷慨,而在发送方面要保守”,你不希望没有充分理由就突破规范的边界。

然而,如果你有充分理由,就去做吧。

0
0 Comments

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 请求上发送有效载荷体可能会导致某些现有的实现拒绝该请求。

0