资源解析后,在ngResource对象的$ promise属性的then()函数中获取响应头?

时间:2014-04-06 18:40:40

标签: angularjs rest angularjs-resource

我愿意检索资源请求的响应头,因为我已经在其中放入了分页信息而不是响应主体,以使REST api清晰。

虽然我们可以从下面的成功/错误回调中获取它:

Object.get({type:'foo'}, function(value, responseHeaders){
    var headers = responseHeaders();
});

'Object'是我的资源工厂服务。

此外,当我尝试在解决所需资源后更改路线时,我尝试过这样做:

.when('/list', {
    templateUrl: 'partials/list.html',
    controller: 'ListCtrl',

    // wait for the required promises to be resolved before controller is instantialized
    resolve: {
        objects: ['Object', '$route', function(Object, $route){
            return Object.query($route.current.params).$promise;
        }]
    }
})

并且在控制器中,只需注入“对象”而不是对象服务,因为它已被解析并用实际数据填充。

但是当我尝试从控制器中的“对象”获取标题信息时,我遇到了问题。

我尝试objects.$promise.then(function(data, responseHeaders){}),但是responseHeader未定义。

如何更改$ resource服务的行为,以便将responseHeader getter抛出到$ promise then()回调函数中?

我的服务“对象”供参考:

myServices.factory('Object', ['$resource',
    function($resource){
        return $resource('object/:id', {id: '@id'}, {
            update: {method: 'PUT'},
        });
    }
]);

3 个答案:

答案 0 :(得分:9)

我遇到了完全相同的问题。我在资源定义中使用了一个拦截器来在资源中注入http头。

$resource('/api/resource/:id', {
    id: '@id'
  }, {
    index: {
      method: 'GET',
      isArray: true,
      interceptor: {
        response: function(response) {
          response.resource.$httpHeaders = response.headers;
          return response.resource;
        }
      }
    }});

然后,在then回调中,http标头可通过$httpHeaders访问:

promise.then(function(resource) {
    resource.$httpHeaders('header-name');
});

答案 1 :(得分:5)

我认为我遇到了类似的问题:在发布新资源后,我需要获取响应的Location标头,因为新资源的Id已在服务器上设置,然后通过此标头返回。

我通过引入我自己的承诺来解决这个问题:

app.factory('Rating', ['$resource',
    function ($resource) {

        // Use the $resource service to declare a restful client -- restangular might be a better alternative
        var Rating = $resource('http://localhost:8080/courserater/rest/ratings-cors/:id', {id: '@id'}, {
            'update': { method: 'PUT'}
        });

    return Rating;
}]);

function RestController($scope, $q, Rating) {
  var rating = new Rating();
  var defer = $q.defer(); // introduce a promise that will be resolved in the success callback
  rating.$save(function(data, headers){ // perform a POST
      // The response of the POST contains the url of the newly created resource
      var newId = headers('Location').split('/').pop();
      defer.resolve(newId)
    });
    return defer.promise;
  })
  .then (function(newId) {
    // Load the newly created resource
    return Rating.get({id: newId}).$promise; // perform GET
  })
  .then(function(rating){
    // update the newly created resource
    rating.score = 55;
    return rating.$update(); // perform PUT
  });
}

答案 2 :(得分:3)

我们不能使用#!/usr/bin/python # -*- coding: UTF-8 -*- ''' Application example using build() + return ========================================== An application can be built if you return a widget on build(), or if you set self.root. ''' import kivy kivy.require('1.9.1') from kivy.app import App from kivy.uix.button import Button class TestApp(App): def build(self): # return a Button() as a root widget return Button(text='hello world') if __name__ == '__main__': TestApp().run() 来返回标头,因为promise不允许多个返回值。 (例如,.then

这是一项请求的功能,已关闭https://github.com/angular/angular.js/issues/11056

  

... (res, err)“回调”只能有[一]个参数。原因是这些“回调”对应于同步编程的返回值/异常,并且您不能返回多个结果/从常规函数中抛出多个异常。