为什么在调用img ng-src时没有调用我的http错误响应?

时间:2015-05-11 09:36:07

标签: angularjs angular-http-interceptors

我有以下问题:我试图从服务器捕获HTTP 500响应,但拦截没有获得500响应。这是通过img src调用未经授权的URL生成的(技术上服务器应返回4xx,但它返回5xx - >它是第三方服务器。

更新2:如果我执行直接$ http.get,则调用HTTP拒绝的拦截但如果http get被隐式调用,则不会调用它img ng-src或img-src。有趣的部分是调用我的httptimeout拦截,但从不调用响应拦截。我该如何解决这个问题?

更新1 :我已经添加了浏览器通过网络检查员收到的500错误的屏幕截图,但未被截获。请看结束。

拦截器代码:

  .factory('timeoutHttpIntercept', function ($rootScope, $q) {
            //console.log("*** HTTP INTERCEPTOR CALLED ***");
            return {
                'request': function (config) {
                    config.timeout = 15000;
                    //console.log("*** HTTP INTERCEPTOR CALLED ***");
                    return config;
                }


            };
        })

.factory ('httpAuthIntercept', function ($rootScope, $q)
{
    return {
    requestError: function (response) {
      console.log ("**** REJECT REQUEST: "+JSON.stringify(response));
      return $q.reject(response);
    },

    responseError: function (response) {
      console.log ("**** REJECT RESPONSE: "+JSON.stringify(response));
      return $q.reject(response);
    },
    response: function (response)
        {
            console.log("*******RESPONSE with status: "+response.status+"****************");
            if (response.status == 500)
            {
             console.log ("**** RESPONSE: "+JSON.stringify(response));
            }
                return (response);
        }
  };
})

接下来是.config:

 $httpProvider.interceptors.push('timeoutHttpIntercept');
 $httpProvider.interceptors.push('httpAuthIntercept');

现在,在我的模板中,我调用以下代码:

<img ng-src="{{LoginData.url}}/cgi-bin/zms?mode=jpeg&amp;monitor={{monitorId}}&maxfps=3&buffer=1000&auth=1234&rand={{rand}}" width="100%" />

以上触发500响应。我看到服务器日志也生成了这个:

Starting capture on eth0 interface
2015-05-11 05:12:44 xx.xx.xx.xx 192.168.1.13    >   GET <server.com>    /cgi-bin/zms?mode=jpeg&monitor=1&maxfps=3&buffer=1000&auth=1234&rand=116426 HTTP/1.1    -
2015-05-11 05:12:44 192.168.1.13    xx.xx.xx.xx <   -   -   -   HTTP/1.1    500 Internal Server Error

但由于某种原因,auth拦截并没有捕获500.如果我删除500中的auth拦截检查,我可以看到它捕获200 OK的成功响应。

我做错了什么?

收到500响应截图 - &gt; Safari的网络检查员:

500 error being received

由于

2 个答案:

答案 0 :(得分:0)

您使用的angularjs版本是什么?如果它&lt; 1.3可能值得尝试将您的拦截器推送到 $httpProvider.responseInterceptors 而不是 $httpProvider

app.factory('MyHttpInterceptor', function($q) {
        return function (promise) {
            return promise.then(function (response) {
                return response;
            },
            function (response) {
                if (response.status === 500) {
                    // you should hit this for HTTP 500
                }
                return $q.reject(response);
            });
        };
    });


app.config(function ($routeProvider, $httpProvider) {

   // rest of the config code

    $httpProvider.responseInterceptors.push('MyHttpInterceptor');
})

另一种实现

app.factory('MyHttpInterceptor', ['$q', function ( $q) {
    function success(response) {
        // all good
    return response;
    }
    function error(response) {
        var status = response.status;
        if (status == 500) {
            return;
        }
        // otherwise
        return $q.reject(response);
    }
    return function (promise) {
        return promise.then(success, error);
    }
}]);

答案 1 :(得分:0)

我遇到了类似的问题。

在使用Fiddler(代理)生成500错误后,我没有触发拦截器的responseError方法。在fiddler中,您可以为某些文件创建自己的响应。问题不知何故是在我自己创建的响应中。不确定问题出在哪里。但是我在Fiddler中复制了其中一个响应后,我得到了方法responseError。

也许您从第三方服务器获得的回复无论如何都是无效的。

如果您想尝试使用Fiddler。在programm文件夹中,您有一些ResponseTemplates C:\ Program Files \ Fiddler2 \ ResponseTemplates

已复制&#34; 502_unreachable.dat&#34; to&#34; 500_servererror.dat&#34;并且只将响应代码修改为500并且保持响应体未触及。

重新启动了Fiddler,我可以将我新创建的Fiddler响应应用为自动响应器。 是的,它触发了responseError方法。