如何获取 jQuery.ajax 响应状态?

Posted

技术标签:

【中文标题】如何获取 jQuery.ajax 响应状态?【英文标题】:How to get jQuery.ajax response status? 【发布时间】:2011-10-17 22:21:22 【问题描述】:

有什么方法可以知道返回的 jqXHR 对象是否是从另一个请求重定向的?例如,具有以下代码:

   jQuery.ajax(
            type:       'POST',
            url:        'http://example.com/page.html',
            complete:   function(response, status) 
                        console.log(response.statusCode);
                        // do something
                        
        );

如果 ajax url 使用 301 或 302 状态码重定向,则响应将是重定向页面的结果,并将返回 200(OK)状态码。我认为这是一个 jQuery 的错误(不知道这是否是预期的行为,因为最终的响应实际上是成功的) 我无法获取原始响应标头来检查是否存在位置标头,因为这仅适用于重定向请求。

使用上述代码的 Firebug 通过 XHR 记录这两个请求

http://example.com/page.html302(临时搬家) http://example.com/redirect.html200(正常)

但是 jQuery 只返回来自第二个请求的数据。

也许有办法从第一个请求中获取数据?或者获取响应 url 并将其与原始请求中的进行比较?

【问题讨论】:

【参考方案1】:

问题在于,由于符合标准,301 或 302 由浏览器直接处理。此状态代码不会传递给您的 ajax 调用。您知道调用已完成的唯一方法是在完成处理程序中,而且在传递给完成的 jqxhr 对象中没有给出有用的状态。 Success 和 Error 处理程序永远不会被调用。

我们有一些遗留的 ruby​​ 露营代码在调用 post() 方法时使用重定向到 get() 方法,以便我们可以通过资源的 ruby​​ 显示更新的视图。当我们从露营视图切换到 javascript 视图时,301/302 没有传递给 jqxhr 对象。我们不得不重写 post 方法以返回 200 来解决问题。

这里有一些关于这个主题的 *** 帖子。

How to manage a redirect request after a jQuery Ajax call

Catching 302 FOUND in JavaScript

HTTP redirect: 301 (permanent) vs. 302 (temporary)

【讨论】:

【参考方案2】:

我发现可能有帮助的一个工具是wireshark。它是免费的,并且可能能够找出 jqXHR 对象发生了什么。它相当容易使用,但请遵循以下说明:

http://www.wireshark.org/ Wireshark 是适用于 Unix 和 Windows 的网络协议分析器。到目前为止,我只使用了这个工具,但它在分析你的机器和网络上其他人之间的请求时会派上用场。

开始之前 - Wireshark 捕获每个请求,因此只有在准备好捕获时单击开始,完成后单击停止。 - 你需要你的 IP 地址

阅读更多关于analysing HTTP requests

【讨论】:

以上是关于如何获取 jQuery.ajax 响应状态?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Ajax - 如何错误地获取响应数据

如何从 REST API 获取响应并从 jquery ajax 调用执行操作?

如何使用 jquery ajax 整个表单

如何在 jQuery ajax 调用中将 JSON 响应解析为 JSONP?

jquery ajax如何判断正在进行

如何使用 JQuery.ajax 从每个 WordPress 帖子中获取缩略图附件?