我正在为我们的应用程序开发一个新的 RESTful Web 服务。
在某些实体上执行 GET 时,客户端可以请求实体的内容。如果他们想要添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数。
或者,我希望人们能够在请求正文中指定这些参数。 HTTP / 1.1似乎没有明确禁止这一点。这将允许他们指定更多信息,可以更容易地指定复杂的 XML 请求。
我的问题:
是。换句话说,任何 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 主体中查看参数是否会对响应产生影响。