协慌网

登录 贡献 社区

带请求正文的 HTTP GET

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

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

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

我的问题:

  • 这完全是一个好主意吗?
  • HTTP 客户端在 GET 请求中使用请求主体会有问题吗?

http://tools.ietf.org/html/rfc2616

答案

罗伊菲尔丁关于将一个机构纳入 GET 请求的评论

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

所以,是的,您可以使用 GET 发送一个正文,不,这样做永远不会有用。

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

罗伊....

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

[...] 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息体。

HTTP / 1.1 规范中的 GET 方法的描述,第 9.3 节

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

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

虽然你可以这样做,但是在 HTTP 规范没有明确排除的范围内,我建议避免使用它只是因为人们不希望事情以这种方式工作。 HTTP 请求链中有许多阶段,虽然它们 “大部分” 符合 HTTP 规范,但您唯一可以肯定的是它们的行为与 Web 浏览器传统上一样。 (我在想透明代理,加速器,A / V 工具包等等)

这就是 “ 稳健性原则 ” 背后的精神,大致是 “你接受的是自由的,你所发送的是保守的”,你不想在没有充分理由的情况下突破规范的界限。

但是,如果你有充分的理由,那就去吧。

如果您尝试利用缓存,则可能会遇到问题。代理人不会在 GET 主体中查看参数是否会对响应产生影响。