HTTP GET和POST的语义和限制(HTTP GET and POST semantics an

2019-07-29 20:02发布

本周早些时候,我不得不做一些东西,感觉就像一个语义冲突。 让我解释。

我正在一个简单的AJAX客户端应用程序,这是使一个服务的请求以及参数给定数。 由于整个程序基本上是只读的,我认为使用HTTP GET是要走的路。 有的,我必须通过参数很简单(如排序顺序,或页码)。

然而,所需的参数之一可能是可变长度的,这让我担心。 因为我编码所有在GET请求中的查询字符串的参数,它似乎我,这个放置了不必要的(大致)2000个字符的请求URL上限 。 也不管,我不喜欢看到500个字符长的URL请求。

所以,因为POST请求没有这样的限制,我决定转行。 但是,这感觉不对。 我的印象是一个POST表示数据的修改下 - 但我使用它的一个简单的只读请求。

有一个更好的方法吗? 要执行GET,有很多参数? 我听说过一个方法-在执行参数本身的一个初步的帖子,然后执行GET。 但是,这种技术极不理想。

但看过去的这种特殊情况下, 什么是HTTP请求方法的真正语义和限制? 为什么被弄不支持任何类型参数的有效载荷的? 在URL中使用查询字符串几乎感觉就像一个黑客给我。

Answer 1:

在这个问题上的几点:

  • HTTP规范(RFC 2616)不forbit GET请求有参数,所以它不是HTTP的语义的问题GET本身。 然而,许多HTTP堆栈(客户端,服务或代理)禁止在HTTP请求的身体,事实上,你不能使用它们大多是一个实现细节(非常普遍)高于HTTP GET请求语义问题
  • 类似地,URI(或查询字符串)长度的限制未在RFC指定了。 这主要是由几个HTTP服务器实现的安全缓解堆栈,以防止不良客户端从服务器消耗的资源(例如IIS / ASP.NET默认限制为2k,但你可以在web.config中通过一些元素增加它)。 再次,它不是一个语义,但一个现实的问题。
  • POST请求做指示数据修改,如果你遵循REST的理念,但也有用于只读操作HTTP POST请求的例子很多。 SOAP使用POST在其所有请求,无论它是调用操作是否是一个“安全”或“修改”之一。 所以,你可以使用POST进行这些操作为好。 然而,从REST(和“规范”的HTTP)使用情况不同的是,你会失去一些协议的功能,如高速缓存,其可应用于GET请求,但不为POST。
  • 你用两个请求的例子(POST与参数+ GET“获取”的结果),似乎矫枉过正。 正如我所说,POST请求并不一定意味着修改的资源,所以你不必创建一个新的“协议”(POST + GET)当一个请求到可以访问操作。


文章来源: HTTP GET and POST semantics and limitations