【问题标题】:How to get jQuery.ajax response status?如何获取 jQuery.ajax 响应状态?
【发布时间】: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 并将其与原始请求中的进行比较?

【问题讨论】:

    标签: ajax jquery redirect jqxhr


    【解决方案1】:

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

    我们有一些遗留的 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)

    【讨论】:

      【解决方案2】:

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

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

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

      阅读更多关于analysing HTTP requests

      【讨论】:

        猜你喜欢
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 2020-01-10
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多