从不调用AngularJS $ http错误函数

Pau*_*aul 24 angularjs

我有这么简单的代码:

$http.get("/api/test")
    .success(function (data, status, headers, config) {
        console.log(data);
        return data;
    }).error(function (data, status, headers, config) {
        alert("error");
        return status;
});
Run Code Online (Sandbox Code Playgroud)

它工作正常,但即使我从服务器返回404(未找到),也从不调用错误函数...在这种情况下,它调用状态= 404的'成功'函数...

那是对的吗?

谢谢

小提琴手:

Request

GET http://localhost:41234/api/test HTTP/1.1
Host: localhost:41234
Connection: keep-alive
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko)    Chrome/25.0.1364.172 Safari/537.22
Referer: http://localhost:41234/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=bd1b3rib5j4beub0xbuhb1hm; FormsAuthentication=xxxxx

Response

HTTP/1.1 404 Not Found
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcUGVzc29hxvY2FyLkFwaVxhcGcg==?=
X-Powered-By: ASP.NET
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)

wil*_*ver 26

我有同样的问题,老实说,按照这篇文章的提示把我放错了方向......所以,我分享我的案例/解决方案,所以在我同样情况下的其他人可以节省时间.

我正在使用Angular.js 1.2.14 + WebApi 2.这是我对NotFound状态的回复:

Cache-Control:no-cache
Content-Length:0
Date:Sat, 15 Mar 2014 14:28:35 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcU3ZpbHVwcG9EaXNjaXR1clxhcGlcTWFnMTRcYXBpXGxlc3Nvblw4NA==?=
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,Content-Lenght:0,但没关系.

我的问题是没有正确使用Angular.js拦截器,特别是这样的:

responseError: function (result) {
                // check something 
                return result;
            }
Run Code Online (Sandbox Code Playgroud)

返回结果而不抛出异常或拒绝承诺(如文档中所述)使得Angular相信我想要以正确的分辨率转换拒绝,然后调用成功回调.

我更正了我的代码如下:

responseError: function (result) {                    
                // check something 
                return $q.reject(result);
            }
Run Code Online (Sandbox Code Playgroud)


Dan*_*mes 5

问题是您的网络服务器,它将content-length设置为0,这意味着它是一个有效的值,您可以在HTTP/1.1规范中看到.

我还在JSFiddle上做了一个示例,显示了错误和成功示例.看到这里.

错误示例中的标头:

请求:

GET /error/ HTTP/1.1
Host: fiddle.jshell.net
Connection: keep-alive
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like  Gecko) Chrome/26.0.1410.65 Safari/537.31
DNT: 1
Referer: http://fiddle.jshell.net/danielcsgomes/cAMc6/1/show/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: UTF-8,*;q=0.5
Cookie: csrftoken=4tNVNxC5v6BSq9yJCKkHlGFJBz3cClqd`
Run Code Online (Sandbox Code Playgroud)

响应:

HTTP/1.1 404 NOT FOUND
Server: nginx/0.8.54
Date: Fri, 12 Apr 2013 00:38:07 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Cookie
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不应该被标记为正确,这实际上是错误的,就像AgDude提到的那样.对我来说,正确答案来自@wilver(见下文)! (5认同)
  • 这是不正确的.Angularjs并不关心内容长度是多少. (4认同)