Как установить пользовательские заголовки с действием $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.
Есть ли способ сделать это?
Ответы
Ответ 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
});