【问题标题】:What are the advantages of using a GET request over a POST request?与 POST 请求相比,使用 GET 请求有什么优势?
【发布时间】:2010-09-16 17:59:49
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 不幸的是,这似乎没有回答这个问题。 " What are the advantages of using a GET request over a POST request? " " Thus, i'm wondering if there is any reason why I should use GET request at all. "
    【解决方案2】:

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

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

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

    "Atlas 默认为所有 AJAX 调用进行 HTTP POST。Http POST 是 比 Http GET 贵。它通过网络传输更多字节, 从而占用宝贵的网络时间,这也使 ASP.NET 做更多的事情 在服务器端处理。所以,你应该尽可能多地使用 Http Get 可能的。但是,Http Get 不允许您将对象作为 参数。您只能传递数字、字符串和日期。当你做 一个 Http Get 调用,Atlas 构建一个编码的 url 并对其进行命中 网址。所以,你不能传递太多使 url 变成 大于 2048 个字符。据我所知,这就是最大值 任何 url 的长度。

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

    【讨论】:

    • “它们更快”只是因为它可以被缓存?
    • 不,也是因为它们的工作方式;它们在发送数据的内容和方式上完全不同。见omaralzabir.com/…
    • 这是回答 OP 问题的唯一答案。其他人在谈论差异。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      GET 请求在 URL 字符串中传递,因此受到通常取决于浏览器的长度限制。 It seems that most are around 2000 chars.

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • > POST 请求与 GET 一样不安全。不完全正确,但我确实理解你的观点。 GET 请求通常会将其数据记录在不安全的访问请求日志文件中 - 而 POST 通常不会。
          • POST 和 GET 并非天生安全或不安全。使用其中一种与安全性毫无关系。
          【解决方案7】:

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

          POST 在您不希望将事件添加为书签或作为 URL 输入的情况下很重要 - 否则您(或 Google 抓取您的 URL)最终可能会意外地执行以下操作例如,从您的系统中删除用户。

          【讨论】:

          • 书签实际上与提问者要求的 AJAX 无关。
          • 不正确,除非您想忽略 AJAX 应用程序中的后退/前进按钮。如果没有,那么您需要在 URL 中使用哈希,这与 GET url 和书签直接相关。
          猜你喜欢
          • 2017-06-05
          • 1970-01-01
          • 2014-07-24
          • 1970-01-01
          • 1970-01-01
          • 2020-03-24
          • 2020-11-23
          • 2015-08-06
          • 2014-05-12
          相关资源
          最近更新 更多