【问题标题】:Is there any performance difference when using different HTTP methods?使用不同的 HTTP 方法时是否有任何性能差异?
【发布时间】:2012-08-06 17:51:11
【问题描述】:

我知道 HTTP 方法的工作原理以及它们的设计目的,但我很想知道某些方法在仅用于获取数据时是否比其他方法更快。
在我正在工作的团队中,我注意到很多 JQuery ajax 请求如下所示:

$.ajax({url: "../dir/someFile.json", method: 'post', dataType: 'json',
    error: function(...){ ... },
    success: function(...){ ... }       
});

我显然会使用“获取”方法,因为没有数据发送到此请求。这可能发生在队友复制和粘贴代码时。这也很好用,似乎没有充分的理由将其更改为“get”。

我认为在这种情况下使用 'get' 方法会更快,但我没有找到任何证实这一点的来源。

【问题讨论】:

    标签: ajax jquery http-method


    【解决方案1】:

    有一些研究表明,一些浏览器会将一个 POST 请求分成多个数据包。这可能会对性能产生影响,您认为这会使请求变慢。但是,在测试中,POST 似乎有时会更快。我不确定这是为什么。

    但实际上,性能差异可以忽略不计,您应该按预期使用 POST 和 GET。

    阅读:

    【讨论】:

    • 对其他方法有什么想法吗,比如 PUT 或 DELETE?
    • 不知道。据我所知,将请求拆分为多个数据包的整个概念是浏览器实现决策。因此,不能保证浏览器会为 PUT 或 DELETE 做什么。但是,我的猜测是 PUT 将像 POST 一样处理,而 DELETE 可能也像 POST 一样,但我对此不太有信心。
    【解决方案2】:

    至少在 IE 的历史版本中,存在 POST 传输额外数据包的问题。在这里对此进行一些讨论:

    http://josephscott.org/archives/2009/08/xmlhttprequest-xhr-uses-multiple-packets-for-http-post/

    不过,我不知道这与当前浏览器的相关性有多大。

    以下是文章中描述的测试结果:

    • IE 6 – 2 个数据包
    • IE 7 – 2 个数据包
    • IE 8 – 2 个数据包
    • Firefox 3.0.13 – 1 个数据包
    • Firefox 3.5.2 – 1 个数据包
    • Opera 9.27 – 2 个数据包
    • Safari 4.0.3 – 2 个数据包
    • Chrome 2.0.172.43 – 2 个数据包

    【讨论】:

      【解决方案3】:

      这似乎很明显,但是在使用 POST 与 GET 时,您在方法名称中多使用了一个字节。

      此外,如果您有(很少)数据要发送,使用 GET 将对数据进行 URL 编码(这意味着生成和发送的字节数将高于数据本身的大小),而 POST 将消耗更多字节(通常)因为该请求将另外包含一个 Content-Type: application/x-www-form-urlencoded 标头,可能是一个 Content-Length 标头加上 与 GET 相同的 URL 编码数据。

      如果你有一些二进制数据要发送,那么问题就不成立了,因为你不能用 GET 来做。

      我们这里说的是便士,但是如果你积累便士......

      最终,GET 请求会更短,并且在相同的网络链路带宽下,会比 POST 更快。

      要发送二进制数据,PUT 将比 POST 更快(基于相同的逻辑,并且因为 POST 将使用multipart/form-data 编码标头),但浏览器对 PUT 请求的支持更有限。

      【讨论】:

        【解决方案4】:

        在所有条件相同的情况下,GET、POST 或任何其他方法之间的网络性能没有差异。这完全取决于服务器如何处理 GET 与 POST 请求。例如,服务器可能会尝试在 POST 上更新资源,但仅在 GET 上搜索它。

        此外,使用 GET,您可以发送数据。在 jQuery 中,它只是被序列化为查询字符串($.get("someplace", data: { foo: "bar" }) 被发送为$.get("someplace?foo=bar"))。

        【讨论】:

          猜你喜欢
          • 2015-04-03
          • 1970-01-01
          • 2017-04-06
          • 2016-03-22
          • 1970-01-01
          • 2020-09-13
          • 1970-01-01
          • 2012-12-15
          • 2018-10-26
          相关资源
          最近更新 更多