Подтвердить что ты не робот

Как установить пользовательские заголовки с действием $resource?

с $http, мы можем это сделать:

var config = { headers: { 'something': 'anything' } };          
$http.get('url/to/json', config)
    .success(function() {
        // do something…
    })

Я хотел бы сделать то же самое с ссылкой $resource (не работает):

var config = { headers: { 'something': 'anything' } };
MyResource.get( 
    config,
    function() { // success
        // do something…
    }
); 

с соответствующей службой, объявленной следующим образом:

.factory('MyResource', function($resource){
    return $resource('url/to/json');
})

он не работает: объект конфигурации переходит к URL-адресу, а не в заголовки http.

Есть ли способ сделать это?

4b9b3361

Ответ 1

headers для $resource доступен с AngularJS 1.1.1. Убедитесь, что у вас установлена ​​правильная версия.

Формат

$resource('url/to/json', {}, {headers: { 'something': 'anything' }});

[править zuma] Вышеприведенное не кажется правильным. Третий параметр для $resource должен быть другим. Это кажется мне более правильным:

$resource('url/to/json', {}, {
    get: {
        method: 'GET',
        headers: { 'something': 'anything' }
    }
});

Ответ 2

Объект headers внутри действия ресурса поддерживает как значения static для своих полей, так и значения dynamic, возвращаемые функцией.

$resource('url/to/json', {}, {
        get: {
            method: 'GET',
            headers: { 
               'header_static': 'static_value',
               'header_dynamic': dynamicHeaderVal
            }
        }
});

function dynamicHeaderVal(requestConfig){
     // this function will be called every time the "get" action gets called
     // the result will be used as value for the header item
     // if it doesn't return a value, the key will not be present in the header
}

Ответ 3

Демо-код

angular.module('Test',['ngResource'])
 .controller('corsCtrl', function ($scope, $http, MyResource) {

  $http.defaults.headers.common['test']= 'team'; //Using $http we can set header also
  MyResource.get();
})
.factory('MyResource', function($resource) {   //Services
  return $resource('url/to/json');
})

JsFiddle DEMO

see in Request Header

Ответ 4

Чтобы использовать заголовок Content-Type, вам может потребоваться указать тело данных, по крайней мере, для версий около 1.4.7+ из-за $http удаления заголовков без тела данных, которые === 'content-type'. См. # 10255 в 1.4.7/angular.js

Я просто установил "data: false", чтобы обмануть его, не указав тело данных:

$resource('url/to/json', {}, {
    get: {
        method: 'GET',
        data: false,
        headers: { 'something': 'anything' }
    }
});

Ответ 5

Вы можете установить динамические одноразовые заголовки, обратившись к объекту API конфигурации в ресурсе.

Демонстрационный код

angular.
.factory('Resource',['$resource',function($resource){return $resource(baseUrl+'/resource/:id', {id: '@_id'}, {
update    : {
  method  : 'POST',
  url     : baseUrl+'/resource/:id',
  headers : {
    'custom-header': function(config) {
      // access variable via config.data
      return config.data.customHeaderValue;
    }
  },
  transformRequest: function(data) {
    // you can delete the variable if you don't want it sent to the backend
    delete data['customHeaderValue'];
    // transform payload before sending
    return JSON.stringify(data);
  }
} 
});
}]);

Выполнить

Resource.update({},{
  customHeaderValue: setCustomHeaderValue
},
function (response) {
  // do something ...
},function(error){
  // process error
});