为啥不总是使用 HTTP post 进行 ajax 调用?

Posted

技术标签:

【中文标题】为啥不总是使用 HTTP post 进行 ajax 调用?【英文标题】:Why not always use HTTP post for ajax calls?为什么不总是使用 HTTP post 进行 ajax 调用? 【发布时间】:2012-01-19 04:40:21 【问题描述】:

我知道 HTTP get 和 post 方法之间的区别(如 this 问题中的详细说明)。 我的问题是为什么不总是使用 post 方法进行 AJAX 调用,这是安全的。有更快的获取请求吗?是否有理由更喜欢获取而不是发布?

对于没有 ajax 调用是有原因的 - 共享指向同一个 url 的链接,但对于 AJAX 这个参数并不好......

【问题讨论】:

【参考方案1】:

GET 请求更小更快;并在客户端和任何可能正在运行的代理中利用缓存。

对于预计不会经常更改的数据,GET 请求通常非常明智,因为除非必要,否则它们更有可能不被重新发送。

但是,对于预计会更频繁更改的数据,POST 确实是更安全的选择,因为它总是会重新发送到服务器,确保始终遵守更改。

还存在语义问题。 POST 请求实际上应该只在意图修改服务器上的数据时使用。

【讨论】:

【参考方案2】:

前几天我正在阅读雅虎加速网站速度的最佳实践,他们已经很好地解释了为什么我们应该更喜欢发布帖子,这里是帖子 sn-p 供您参考

使用 XMLHttpRequest,POST 在浏览器中实现为一个两步过程:首先发送标头,然后发送数据。所以最好使用 GET,它只需要发送一个 TCP 数据包(除非你有很多 cookie)。 IE 中的最大 URL 长度为 2K,因此如果您发送超过 2K 的数据,您可能无法使用 GET。

一个有趣的副作用是,没有实际发布任何数据的 POST 的行为类似于 GET。根据 HTTP 规范,GET 用于检索信息,因此当您仅请求数据而不是发送数据以存储在服务器端时(语义上)使用 GET 是有意义的。

详情请参考该页面

Yahoo Best Practices for speed up

【讨论】:

【参考方案3】:

我的问题是为什么不总是对 AJAX 调用使用 post 方法

因为在 RESTful 应用程序中,将 POST 动词用于不修改服务器状态的操作是没有意义的。在 RESTful 应用程序中,请求是如何发出的并不重要:它是普通的、AJAX 还是机器人。

此外,GET 请求通常更快,并且被浏览器缓存。

【讨论】:

第二部分足以让我更喜欢 GET 而不是 Post,但我不会被说服 遵循 REST 标准,因为它没有更快和缓存。还有其他理由不使用 Post 方法进行非关键操作吗? @gdoron,我个人在我的应用程序中始终遵循 REST 标准,所以这对我来说是第 1 个论点。【参考方案4】:

GET 对服务器使用一个请求,而 POST 使用两个请求。

根据 Yahoo 的 YSlow 团队的说法,当传输的内容小于 IE 的 2K 限制时,您应该选择 GET。在这里阅读更多:http://developer.yahoo.com/performance/rules.html#ajax_get

【讨论】:

一个 POST 由 2 个请求组成的印象是什么? @Gareth,也许是他提供的链接...? @gdoron TCP 数据包与 HTTP 请求不同。任何类型的请求都可以拆分为多个 TCP 数据包,只是碰巧大多数(不是所有)浏览器 use a minimum of 2 packets 用于 AJAX POST。让我们明确一点,对 TCP 数据包进行计数充其量只是微优化,而微优化很少能很好地回答有关您是否应该“总是”做某事的问题。 @Gareth 这绝对是 NOT 在一个主要取决于延迟的过程中的微优化 - 根据情况(尤其是延迟),这确实会产生影响。使用 1 个数据包,服务器可以立即处理它,而使用 2 个数据包,您通常会在两者之间进行典型的确认,这可能意味着增加了 2 倍的端到端延迟。数据包错误的可能性也增加了 100%,等等。不过,我同意你的观点,这不应该被视为“总是”做某事的理由。

以上是关于为啥不总是使用 HTTP post 进行 ajax 调用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥http post响应在响应末尾添加随机字符

为啥我的一个ajax请求总是被取消,回复data为空

Angular 的 $http.post 不起作用,它的 $http... 也不起作用,但 jQuerys ajax 起作用。为啥?

为啥不总是预检 POST 请求?

为啥 POST 不支持字符集,但 AJAX 请求可以?雄猫 6

如何确定为啥 jQuery ajax $.post 请求不成功?