【问题标题】:HTTP GET and POST semantics and limitationsHTTP GET 和 POST 语义和限制
【发布时间】:2012-06-10 05:15:21
【问题描述】:

本周早些时候,我不得不做一些感觉像是违反语义的事情。让我解释一下。

我正在制作一个简单的 AJAX 客户端应用程序,它向具有给定数量参数的服务发出请求。由于整个应用程序基本上是只读的,我认为使用 HTTP GET 是要走的路。我必须传递的一些参数很简单(例如排序顺序或页码)。

但是,其中一个必需的参数可能是可变长度的,这让我很担心。由于我正在对 GET 请求的查询字符串中的所有参数进行编码,因此在我看来,这放置了一个不必要的 upper limit of (roughly) 2000 characters for the request URL。无论如何,我不喜欢看到 500 个字符长的请求 URL。

因此,由于 POST 请求没有这样的限制,我决定切换。但这感觉不对。我的印象是 POST 表示修改数据 - 但我将它用于简单的只读请求。

有没有更好的方法来做到这一点?执行一个 GET,有很多参数?我听说过一种方法 - 您自己执行 参数 的初步 POST,然后执行 GET。但是,这种技术还有很多不足之处。

但是看看这个特定的案例,HTTP 请求方法的真正语义和限制是什么? 为什么 GET 不支持任何类型的参数负载?在 URL 中使用查询字符串对我来说几乎是一种 hack。

【问题讨论】:

  • 为什么你觉得那个帖子代表数据修改?
  • @ConradFrix:因为它用于提交表单、上传文件和general non-idempotent actions.
  • 如果你正在编写一个 Ajax 应用程序,你为什么要关心 URL 的长度?另请注意,2000 个字符的限制仅适用于浏览器 URL,不适用于 Ajax 请求(如您提供的链接的 cmets 中所述)。
  • @JonathanW:我刚刚尝试了一些测试 AJAX 请求,但似乎并非如此。使用 1000 个字符,我得到 404 Not Found(因为我使用的是虚假 URL)。有 2000 个字符,我收到 400 Bad Request,所以它失败了。有 100000 个字符,我根本没有得到回应。

标签: http http-post http-get


【解决方案1】:

关于这个问题的几点说明:

  • HTTP 规范 (RFC 2616) 不禁止 GET 请求带有参数,因此这与 HTTP GET 本身的语义无关。但是,许多 HTTP 堆栈(用于客户端、服务或代理)禁止 HTTP 请求中的主体,您无法使用它们的事实主要是实现细节(相当普遍),而不是 HTTP GET 请求的语义问题
  • 同样,RFC 也没有指定 URI(或查询字符串)长度的限制。它主要是由几个 HTTP 服务器堆栈实现的安全缓解措施,以防止不良客户端消耗服务器资源(例如,在 IIS/ASP.NET 中,默认限制为 2k,但您可以通过 web.config 中的某些元素增加它)。同样,这不是语义问题,而是实际问题。
  • 如果您遵循 REST 理念,POST 请求确实表明数据修改,但是有许多用于只读操作的 HTTP POST 请求示例。 SOAP 在其所有请求中都使用 POST,无论它调用的操作是“安全的”还是“修改的”操作。因此,您也可以将 POST 用于这些操作。但是,如果偏离 REST(以及“规范的”HTTP)使用,您将失去协议的一些功能,例如可应用于 GET 请求但不适用于 POST 的缓存。
  • 您使用两个请求的示例(带有参数的 POST + GET 来“获取”结果)似乎有点过头了。正如我所提到的,POST 请求并不一定意味着修改资源,因此当一个请求足够时,您不必创建新的“协议”(POST+GET)来访问您的操作。

【讨论】:

  • +1 不错的答案,另一个重点:GET 应该是幂等的,因此它可以(并且正在)由客户端自动重试,POST 永远不会重试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多