AngularJS-$http错误回调不工作,即使Web API返回错误响应
我正在从服务器调用一个方法,该方法返回一个错误响应,比如(400&500个错误),但是我的AngularJS错误回调没有被调用,并且总是调用成功回调,即使我的状态代码包含400或500。有人能告诉我我做错了什么吗?请参见下面的angular&WebAPI代码: AngularJS代码:AngularJS-$http错误回调不工作,即使Web API返回错误响应,angularjs,asp.net-web-api,Angularjs,Asp.net Web Api,我正在从服务器调用一个方法,该方法返回一个错误响应,比如(400&500个错误),但是我的AngularJS错误回调没有被调用,并且总是调用成功回调,即使我的状态代码包含400或500。有人能告诉我我做错了什么吗?请参见下面的angular&WebAPI代码: AngularJS代码: $http.get("/api/employee") .success(function (data, status, headers, config) { console.log(dat
$http.get("/api/employee")
.success(function (data, status, headers, config) {
console.log(data);
return data;
}).error(function (data, status, headers, config) {
alert("error");
return status;
});
Web API代码:
public HttpResponseMessage Get(EmployeeModel employee)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
//some other code
}
我从来并没有幸运地使用过.success和.error选项,最终使用了.then for everything并没有出现问题。我还应该指出,你不能像你试图做的那样,从承诺中返回价值。在输入承诺或在承诺内分配新的$scope变量之前,必须使用var声明变量 因此,通过这些更改,您的代码将如下所示:
var employees = $http({method:'GET', url:'/api/employee');
employees.then(function(data){
$scope.employeeData = data;
}, function(data){
//do error handling here
});
此外,拥有一个集中的方法来处理错误有时会很有帮助,这可以通过使用httpInterceptor来完成(这里详细介绍:)。这样做将允许您完全删除中的第二个函数。然后,如果没有其他错误处理需要执行,则可以节省代码和带宽。我也有同样的问题,我自己仍在解决这个问题,但我发现了一个可能的问题
.error()
回调可能会被HTTP响应拦截器阻止执行(通过添加到$httpProvider.interceptors
数组注册)
我使用了一个模块来添加拦截器,所以我删除了这个模块并手动编写了这些内容。我创建了一个拦截器来捕获每个HTTP请求的延迟,并面临同样的问题。解决办法非常简单。只需替换:返回响应带返回$q.拒绝(响应)。例如:
SCM.service('httpService', function($q) {
this.request = function(config) {
if (angular.isObject(config)) {
config.delay = new Date().getTime();
}
return config;
};
this.requestError = function(config) {
if (angular.isObject(config)) {
config.delay = new Date().getTime();
}
return $q.reject(config);
};
this.response = function(response) {
if (angular.isObject(response.config)) {
response.config.delay = new Date().getTime() - response.config.delay;
}
return response;
};
this.responseError = function(response) {
if (angular.isObject(response.config)) {
response.config.delay = new Date().getTime() - response.config.delay;
}
return $q.reject(response);
};
});
SCM.config(function($httpProvider) {
$httpProvider.interceptors.push('httpService');
});
问题是有一个拦截器,它不能正确地传播错误 当一个拦截器的responseError被调用时,它必须将异常传播到调用堆栈中,这样下面的函数调用/回调就会知道在响应不成功时会出现错误
$httpProvider.interceptors.push(函数($q,$rootScope){
返回{
请求:函数(配置){
//需要返回相同的配置/修改的配置/新的配置。
返回配置;
},
requestError:函数(拒绝){
返回$q.reject(拒绝);
},
响应:功能(响应){
//需要返回相同的响应/修改的响应/或新的响应。
返回响应;
},
响应者:功能(拒绝){
返回$q.reject(拒绝);
}
};
});
你能检查浏览器网络选项卡中的响应状态吗?你的JavaScript正在调用GET
,但是你发布了PUT
的代码。使用浏览器调试工具或Fiddler查看发生了什么。抱歉,这是一个打字错误。另外,这是我得到的响应:HTTP/1.1 400错误请求缓存控制:无缓存Pragma:无缓存过期:-1服务器:Microsoft IIS/8.0 X-AspNet-Version:4.0.30319 X-SourceFiles:=?UTF-8?B?RDPCU2HHBLXDB25ZDHJ1Y3RPB25XWJBCGLCQ29UC3RydWN0AW9UV2VIQXBGFWAVXZDWBGLLCG=?=X-POWER-By:ASP.NET日期:Tue,2013年10月29日21:21:18 GMT内容长度:0您使用的AngularJS版本是什么?AngularJS版本1.2存在问题。[*|rc]版本。您可以升级到最新的稳定(1.2.9)版本,它可以正常工作。出于好奇,您是否使用Restanglar?我正在使用它的addResponseInterceptor
方法,但我不确定这是否会干扰$http
服务的拦截器。我试图从中拒绝延迟对象,但没有效果,但我认为错误拦截器(来自setErrorInterceptor
)中有潜力,因为它似乎在处理$http
的错误,尽管restanglar没有直接用于所讨论的调用。我没有使用restanglar谢谢,Matthias。结果是,由于某种原因,该问题只出现了500个错误。我还没有弄清楚,但我不认为Restangular是罪魁祸首。我最好的猜测是某个HTTP响应/错误拦截器返回了一个被拒绝的$q承诺,这阻止了响应/错误传播到后续拦截器。您可能需要熟悉一些角度的源代码才能完全理解它。祝你好运:)你是对的@MatthiasDailey。我在HTTP responseError拦截器中阻止了对拒绝的访问,因为我没有返回$q.promise(拒绝)
。有关正确用法,请参阅。