如何在AngularJS 1.2中获取HTTP响应状态代码

Edd*_* Jr 25 httpresponse response-headers angularjs

使用ngResource在AngularJS 1.2rc(X),我怎么现在得到了状态代码?

RestAPI.save({resource}, {data}, function( response, responseHeaders ) {
});
Run Code Online (Sandbox Code Playgroud)

哪里RestAPI是我的ngResource.

响应具有$promise从服务器返回的对象和资源,但不再具有状态.responseHeaders()如果服务器将状态代码注入头对象,但该函数仅返回真实的返回状态代码,则该函数仅具有状态.所以有些服务器可能会提供服务,而有些服

Bar*_*two 13

您可以使用promiss回调then,catchfinally$resource通话后使用.

例如.如果你想在通话后发现错误,你会做这样的事情:

RestAPI.save({resource}, {data}, callbackFunction).$promise.catch(function(response) {
    //this will be fired upon error
    if(response.status == 500) alert('Something baaad happend');
}).then(function() {
    //this will be fired upon success
});
Run Code Online (Sandbox Code Playgroud)

response对象将拥有statusstatusText性能.status是一个整数状态代码和statusText文本.您还将拥有data包含服务器响应的属性.

编辑:按照建议,它是 response.status

  • 我从我的 WebAPI 返回 400 并且仍然没有触发捕获。“然后”在里面没有反应。 (2认同)

Ara*_*ian 12

您必须在资源声明中添加拦截器.像这样:

var resource = $resource(url, {}, {
    get: {
        method: 'GET'
        interceptor: {
            response: function(response) {      
                var result = response.resource;        
                result.$status = response.status;
                return result;
            }
        }
    }                            
});
Run Code Online (Sandbox Code Playgroud)

用法:

resource.get(params, function(result) {
    console.log(result.$status)
});
Run Code Online (Sandbox Code Playgroud)

默认情况下应该提供IMO状态代码.这个https://github.com/angular/angular.js/issues/8341存在问题


Wor*_*rth -1

我也遇到过类似的问题。我查看了角度库并添加了几行以在响应本身中返回状态。在这个文件中,找到返回承诺的位置。

替换以以下开头的代码块

var Promise = $http(httpConfig).then(函数(响应)

与以下

var promise = $http(httpConfig).then(function(response) {
            var data = response.data,
                promise = value.$promise;

            if (data) {
              // Need to convert action.isArray to boolean in case it is undefined
              // jshint -W018
              if ( angular.isArray(data) !== (!!action.isArray) ) {
                throw $resourceMinErr('badcfg', 'Error in resource configuration. Expected ' +
                  'response to contain an {0} but got an {1}',
                  action.isArray?'array':'object', angular.isArray(data)?'array':'object');
              }
              // jshint +W018
              if (action.isArray) {
                value.length = 0;
                forEach(data, function(item) {
                  value.push(new Resource(item));
                });
              } else {
                copy(data, value);
                value.$promise = promise;
              }
            }

            value.status = response.status;
            value.$resolved = true;

            response.resource = value;

            return response;
          }, function(response) {
            value.status = response.status;
            value.$resolved = true;

            (error||noop)(response);

            return $q.reject(response);
          });
Run Code Online (Sandbox Code Playgroud)

或者你可以添加这一行

value.status = response.status;
Run Code Online (Sandbox Code Playgroud)

然后在像 reponse.status 这样的代码中访问状态。虽然,这是一种黑客行为,但对我有用。我还必须在缩小版本中进行更改。