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

时间:2011-08-02 03:36:48

标签: ajax jquery redirect jqxhr

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

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

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

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

http://example.com/page.html 302(临时移动) http://example.com/redirect.html 200(好)

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

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

2 个答案:

答案 0 :(得分:2)

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

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

以下是该主题的一些stackoverflow帖子。

How to manage a redirect request after a jQuery Ajax call

Catching 302 FOUND in JavaScript

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

答案 1 :(得分:0)

我发现可能能够提供帮助的工具是wireshark。它是免费的,可能能够找出jqXHR对象发生了什么。这很容易使用,但请遵循以下说明:

http://www.wireshark.org/ Wireshark是Unix和Windows的网络协议分析器。到目前为止,我只使用此工具进行了表面处理,但在对机器与网络上的其他人之间的请求进行分析时,它非常方便。

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

详细了解analysing HTTP requests