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

9

有没有办法知道返回的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的一个漏洞(不确定这是否是预期的行为,因为最终响应实际上是成功的)。我也无法获取原始响应头来检查是否存在Location Header,因为这仅在重定向请求中可用。
使用上述代码的Firebug通过XHR记录这两个请求: http://example.com/page.html 302(暂时移动) http://example.com/redirect.html 200(OK)
但是jQuery只从第二个请求返回数据。也许有一种方法可以从第一个请求获取数据?或者获取响应URL并将其与原始请求的URL进行比较?
2个回答

3
问题在于由于符合标准,301或302直接由浏览器处理。这个状态码不会传递给您的ajax调用。您唯一知道调用已完成的方式是在complete处理程序中,并且jqxhr对象传递给complete没有有用的状态。成功和错误处理程序永远不会被调用。
我们有一些遗留的ruby camping代码,当调用post()方法时,它使用重定向到get()方法,以便我们可以通过ruby显示资源的更新视图。当我们从camping视图切换到JavaScript视图时,301/302未传递给jqxhr对象。我们必须重写post方法以返回200来解决问题。
以下是一些关于此主题的stackoverflow帖子。 如何在jQuery Ajax调用之后管理重定向请求 在JavaScript中捕获302 FOUND

HTTP重定向:301(永久)与302(临时)


0
我发现一个可能有帮助的工具是Wireshark。它是免费的,可以找出jqXHR对象发生了什么事情。使用起来相当容易,但请遵循以下说明: http://www.wireshark.org/ Wireshark是Unix和Windows的网络协议分析器。我目前只是浅尝辄止,但在对您的计算机与网络上其他计算机之间的请求进行分析时非常方便。
在开始之前 - Wireshark捕获每个请求,因此只有在准备好捕获时才单击开始,并在完成后单击停止。 - 您需要知道自己的IP地址
阅读更多关于分析HTTP请求的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接