我有以下问题:我试图从服务器捕获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&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的网络检查员:
由于
答案 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方法。