带请求正文的HTTP GET

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

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

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

我的问题:

  • 这完全是一个好主意吗?
  • HTTP客户端在GET请求中使用请求体是否存在问题?
  • http://tools.ietf.org/html/rfc2616


    Roy Fielding关于使用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主体中查看参数是否对响应产生影响。

    链接地址: http://www.djcxy.com/p/1931.html

    上一篇: HTTP GET with request body

    下一篇: Representational state transfer (REST) and Simple Object Access Protocol (SOAP)