通过POST请求使用GET请求有什么好处?

时间:2008-10-12 07:51:06

标签: ajax http http-post protocols http-get

我过去的几个ajax应用程序都使用了GET请求,但现在我开始使用POST请求了。 POST请求似乎稍微更安全,绝对更友好/漂亮。因此,我想知道为什么我应该使用GET请求。

7 个答案:

答案 0 :(得分:23)

我通常会这样设置问题:请求后有什么重要的变化吗?(尽管有记录等)。如果是,则应该是POST请求,如果不是,则应该是GET请求。

我很高兴您将POST请求称为“稍微”更安全,因为这几乎就是它们的原因;伪造用户对页面的POST请求是微不足道的。但是,将其作为POST请求会阻止Web加速器或重新加载意外地重新触发操作。

作为AJAX,还有一个考虑因素:如果您要返回带有回调支持的JSON,请务必小心不要放置任何您不希望其他网站能够在其中看到的敏感数据。维基百科在这些行中存在一个漏洞,其中用户反CSRF令牌通过其JSON API发布。

答案 1 :(得分:15)

您应该在没有副作用的请求中使用GET,例如:只是获取一些信息。该请求可以:

  • 重复没有任何问题 - 如果浏览器检测到错误,它可以静默重试
  • 浏览器缓存其结果
  • 由代理缓存

这些都很好。任何只检索数据(特别是公共数据)的东西都应该是GET。服务器应发送合理的Last-Modified:和Expires:标头,以便在需要时允许缓存。

答案 2 :(得分:12)

然而,在回答问题时,所有优点都是,GET请求在某些场景中比POST请求更有用:

  1. 可以将它们加入书签
  2. 可以缓存
  3. 他们更快
  4. 他们有已知的后果(假设他们不改变数据),所以多次访问他们 时间不是问题。
  5. 为了子孙后代,请在博客注释中更新此评论re:在这里点#3,所有归功于Omar AL Zabir(引用blog post的作者):

      

    “Atlas默认为所有AJAX调用发出HTTP POST .Http POST是   比Http GET贵。它通过线路传输更多字节,   因此占用宝贵的网络时间,这也使ASP.NET做得更多   在服务器端处理。所以,你应该使用Http Get   可能。但是,Http Get不允许您传递对象   参数。您只能传递数字,字符串和日期。当你做   一个Http Get调用,Atlas构建一个编码的URL并对其进行点击   网址。所以,你不能传递过多的内容,这会使网址成为现实   大于2048个字符。据我所知,这就是最大值   任何网址的长度。

         

    http post的另一个坏处是,它实际上是2个电话。第一   浏览器使用“HTTP 100”发送http帖子标题和服务器回复   继续”。当浏览器收到此消息时,它会发送实际的正文。“

答案 3 :(得分:8)

这可以帮助您确定使用GET的位置以及POST的使用位置:

URIs, Addressability, and the use of HTTP GET and POST

答案 4 :(得分:7)

还有一个人没有提到的其他差异。

GET请求在URL字符串中传递,因此通常取决于浏览器的长度限制。

POST请求可能要大得多 - 实际上并没有限制。因此,如果您需要从Web服务器请求数据并且您传递了大量参数信息,那么POST请求可能是唯一的选择。

因此,如前所述,GET请求实际上是用于请求数据(没有副作用),而POST请求通常用于将数据传输回服务器以进行存储(具有副作用)。例如使用POST上传文件。 GET来检索文件。

曾经有一段时间我觉得IE的GET URL字符串很短。 Lotus Notes等一些应用程序使用大量随机字符来表示文档ID。我不喜欢使用另一个生成随机字符串的产品,因此页面URL每次都是唯一的。随机字符串是巨大的...它并不总是与内存中的IE6一起使用。

答案 5 :(得分:6)

POST请求与GET一样不安全。主要区别在于POST用于修改服务器应用程序的状态,而GET仅从中请求数据。

当您使用干净的“restful”URL时,差异很重要,URL本身指定资源,不同的方法会在服务器端触发不同的操作。

答案 6 :(得分:4)

也许最重要的是,GET在网址历史记录中是可识别标记/可查看的,并且可以与Google进行搜索。

POST非常重要,因为您希望该事件可以加入书签或能够作为网址输入 - 否则您(或Google抓取您的网址)可能会意外地执行此类操作例如,从系统中删除用户。