HTTP GET和POST语义和限制

voi*_*hos 10 http http-get http-post

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

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

但是,其中一个必需的参数可能是可变长度的,这让我很担心.由于我编写了GET请求的查询字符串中的所有参数,因此在我看来,这为请求URL设置了(大约)2000个字符的不必要的上限.无论如何,我不喜欢看到500个字符长的请求URL.

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

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

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

car*_*ira 14

关于这个问题的几点:

  • HTTP规范(RFC 2616)不会将GET请求转发为具有参数,因此它不是HTTP GET本身的语义问题.但是,许多HTTP堆栈(对于客户端,服务或代理)禁止HTTP请求中的主体,您不能使用它们的事实主要是实现细节(非常普遍),而不是HTTP GET请求的语义问题
  • 类似地,RFC(或查询字符串)长度的限制也未在RFC上指定.它主要是由几个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永远不会重试. (3认同)