HTTP GET和POST语义和限制

时间:2012-06-10 05:15:21

标签: http http-post http-get

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

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

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

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

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

但是看一下这个具体案例, HTTP请求方法的真正语义和局限是什么?为什么GET不支持任何类型的参数有效载荷?使用URL中的查询字符串对我来说几乎感觉像是黑客。

1 个答案:

答案 0 :(得分:14)

关于这个问题的几点:

  • 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)来访问您的操作。