【问题标题】:Equivalent of angularjs interceptor in jqueryjquery中angularjs拦截器的等价物
【发布时间】:2014-09-24 11:03:38
【问题描述】:

我想像 $httpProvider.interceptors 在 agularjs 中那样拦截来自 REST 请求的响应: https://docs.angularjs.org/api/ng/service/$http

我正在使用 jQuery 制作一个非常小的界面,并且不想为此使用 angular。 你有和Idea吗?

实际上,我要解决的真正问题与此相同: Dealing with a 301 and location headers for a REST response in cross-domain

但我想用 jquery 以同样的方式解决它。

我尝试了这个但没有成功:(只捕获 0 状态而不是 301...)

How can I intercept ajax responses in jQuery before the event handler?

为了回答 V31,我这样做了:

$.ajaxSetup({
    error: function(jqXHR, textStatus, errorThrown) {
        if (jqXHR.status == 301) {
            alert("Element not found.");
        } else {
            console.log(jqXHR.status);
            console.log("Error: " + textStatus + ": " + errorThrown);
        }
    }
});

这是我的控制台:

上面写着:

XMLHttpRequest cannot load *******. The request was redirected to '**************', which is disallowed for cross-origin requests that require preflight. 
0 
Error: error:  

【问题讨论】:

  • 我们可以看看你已经尝试了什么吗?
  • @KevinB : 你能不能多回答一下?
  • 这个问题无法解决,只能通过移除重定向。对不起。您遇到的问题是 CORS 问题。使用 CORS 时无法处理重定向。
  • @KevinB:请看这篇文章:stackoverflow.com/questions/24760792/… 在这里,我设法使用 AngularJs 拦截器在重定向之前捕获了 301!
  • 我的意思是你不能阻止错误出现在控制台中。您当然可以捕捉到错误,V31 的回答向您展示了如何做。然后您可以在 xhr 中找到标题。

标签: javascript jquery angularjs rest


【解决方案1】:

如果准确地解释 OP 的问题,要求是根据从 $.ajax() 调用返回的 statusCode (301) 执行任务? ;在 successerror 回调之前还是代替?

似乎在给定响应 statusCode 之后发生了 OP 处的 error 回调。下面的部分应在任何可能附加到 $.ajax()successerror 回调之前调用 statusCode 回调。

试试

    $.ajaxSetup({
        statusCode: {
            301: function (data, textStatus, jqxhr) {
                var callback = function (name) {
                  $("#results").html(name)
                };
                if (jqxhr.status === 301) {
                // do stuff
                    alert(jqxhr.readyState, jqxhr.getAllResponseHeaders());
                    callback("response: " + String(data || jqxhr.responseText) 
                            + "<br />textStatus: " + textStatus 
                            + "<br />statusCode : " + jqxhr.status 
                            + "<br />statusText : " + jqxhr.statusText);
                };

            }
        }
    });

jsfiddle http://jsfiddle.net/guest271314/D23k2/

http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

【讨论】:

    【解决方案2】:

    您可以使用 ajaxSetup 来捕获 301 错误,如下所示:

    $.ajaxSetup({
        error : function(jqXHR, textStatus, errorThrown) {
            if (jqXHR.status == 0) {
                alert("Element not found.");
            } else {
                alert("Error: " + textStatus + ": " + errorThrown);
            }
        }
    });
    

    更多关于jquery ajax setup

    更新:

    要处理 CORS 问题,您需要启用跨域调用,如下所示:

    var app = angular.module('myApp', []);
    
      app.config(function($httpProvider) {
          //Enable cross domain calls
          $httpProvider.defaults.useXDomain = true;
    
          //Remove the header used to identify ajax call  that would prevent CORS from working
          delete $httpProvider.defaults.headers.common['X-Requested-With'];
      });
    

    正如您所提到的,服务器端代码不在您手中,您需要向该方提出请求,以便将这些标头包含在其 API 调用的响应中(如果尚未完成)

     'Access-Control-Allow-Origin' => '*', 
     'Access-Control-Allow-Methods' => ['OPTIONS', 'GET', 'POST']  
    

    【讨论】:

    • @bastienSander 在您创建的角度拦截器中检查 0。更新答案以检查 0
    • 其实我以为我在 AngularJs 中没有重定向问题,但我确实有!
    • 所以控制台错误并没有给我带来太多困扰,我想阻止 Firefox 向我显示一个弹出窗口,上面写着“这个页面正在尝试重定向你 blablabla”,你有什么想法吗?
    • 好的,所以你想在 angularjs 中解决 cors 问题,对吧?您的服务器的另一件事是使用哪种语言?还是第三方api?
    • @BastienSander:我已经更新了处理 CORS 的答案,希望您的问题可以使用这个解决
    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多