31

过去我的几个 ajax 应用程序使用 GET 请求,但现在我开始使用 POST 请求。POST 请求似乎更安全一些,而且绝对更友好/漂亮。因此,我想知道是否有任何理由我应该使用 GET 请求。

4

7 回答 7

26

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

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

作为 AJAX,还有一个注意事项:如果您要返回支持回调的 JSON,请非常小心,不要将任何您不希望其他网站看到的敏感数据放入其中。维基百科在这些方面存在一个漏洞,用户反 CSRF 令牌通过他们的 JSON API 被泄露。

于 2008-10-12T07:58:33.757 回答
18

然而,所有优点,在回答这个问题时,GET 请求在某些情况下比 POST 请求更有用:

  1. 他们可以加入书签
  2. 它们可以被缓存
  3. 他们更快
  4. 他们已经知道后果(假设他们不更改数据),因此多次访问它们不是问题。

为了子孙后代,使用博客注释更新此评论:此处的第 3 点,全部归功于 Omar AL Zabir(引用的博客文章的作者):

“Atlas 默认为所有 AJAX 调用进行 HTTP POST。Http POST 比 Http GET 更昂贵。它通过网络传输更多字节,从而占用宝贵的网络时间,并且还使 ASP.NET 在服务器端进行额外处理。所以,你应该尽可能使用Http Get。但是,Http Get不允许你将对象作为参数传递。你只能传递数字,字符串和日期。当你进行Http Get调用时,Atlas会构建一个编码的url并让对该网址的点击。因此,您不能传递太多使网址变得大于 2048 个字符的内容。据我所知,这就是任何网址的最大长度。

http post 的另一个坏处是,它实际上是 2 个调用。第一个浏览器发送 http post headers 和服务器回复“HTTP 100 Continue”。当浏览器收到此消息时,它会发送实际的正文。”

于 2009-11-22T01:43:00.113 回答
16

您应该在执行没有副作用的请求时使用 GET,例如仅获取一些信息。该请求可以:

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

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

于 2008-10-12T07:57:52.997 回答
10

还有一个没有人提到的区别。

GET 请求在 URL 字符串中传递,因此受到通常取决于浏览器的长度限制。似乎大多数都在 2000 个字符左右。

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

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

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

于 2009-11-20T03:54:56.133 回答
8

这可能会帮助您决定在哪里使用 GET 以及在哪里使用 POST:

URI、可寻址性以及 HTTP GET 和 POST 的使用

于 2008-10-12T07:54:14.127 回答
6

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

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

于 2008-10-12T07:58:52.090 回答
4

也许最重要的是,GET 可以在 url 历史记录中添加书签/查看,并且可以使用 Google 进行搜索。

POST 在您不希望事件被收藏或作为 URL 输入的情况下很重要 - 否则您(或 Google 抓取您的 URL)最终可能会意外地执行诸如从系统中删除用户之类的操作。

于 2008-10-12T07:57:30.390 回答