我预计不良请求会落入$ http#error中定义的函数中,但这不会发生。相反,我不得不创建一个拦截器。即使我知道状态代码应为404,但响应中返回的状态代码为0。
$http({url: "myurl", method: "GET"}).success(
function(data, status, headers, config) {
if (data.ret_code === 200) {
//do something
}
}).error(function(data, status, headers, config) {
//NEVER GETS HERE ON BAD REQUEST!!
});
这是拦截器:
var interceptor = ['$q', function ($q) {
function success(response) {
return response;
}
function error(response) {
//ALWAYS 0!
var status = response.status;
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
}
}];
1 - 这是为什么? 2 - 有没有办法在$ http#error中捕获错误的请求? 3 - 有没有办法获得实际的404状态代码?
答案 0 :(得分:1)
我知道Android中的“错误”,其中从浏览器缓存传递的文件会提供状态码0.
Github问题: https://github.com/angular/angular.js/issues/1720
黑客攻击修复(来自同一页面):
// fix status code for file protocol (it's always 0) and 0 status code for http(s) protocol on Android devices
status = (protocol == 'file') ? (response ? 200 : 404) : (response && status == 0 && window.navigator.userAgent.indexOf('Android') !== -1 ? 200 : status);
答案 1 :(得分:0)
你可以将$ rootScope传递给拦截器并更新你的错误函数
function error(response) {
if (response.status === 0) {
$rootScope.errorStatus = 'No connection. Verify application is running.';
} else if (response.status == 401) {
$rootScope.errorStatus = 'Unauthorized';
} else if (response.status == 405) {
$rootScope.errorStatus = 'HTTP verb not supported [405]';
} else if (response.status == 500) {
$rootScope.errorStatus = 'Internal Server Error [500].';
} else {
$rootScope.errorStatus = JSON.parse(JSON.stringify(response.data));
}
return $q.reject(response);}
您可以使用errorStatus对象显示错误详细信息。