Angular: пользовательские заголовки игнорируются $ http и $ resource. Почему?
Я пытаюсь получить доступ к службе REST, которую я не контролирую. Первая проблема заключается в том, что служба не включает заголовок Access-Control-Allow-Origin, что является проблемой, которая, если я правильно понимаю, сразу ограничивает меня в JSONP.
Кроме того, по умолчанию этот сервис отправляет XML, а не JSON, хотя он способен отправлять JSON. Я думаю, что он должен отвечать на мой заголовок Accept, люди, ответственные за сервис, говорят, что он смотрит на мой Content-Type. Это означало бы, что мне нужно сделать POST, а не GET (хотя get имеет больше смысла, когда я просто получаю некоторые статические данные, верно?).
Упрямый как я, я сначала пробую свой заголовок Accept. Поскольку Angular принимает только JSON, я ожидаю, что он будет использоватьAccept: application/json
заголовок по умолчанию, но это не так, и он игнорирует мои попытки установить его вручную:
app.config(['$httpProvider', function($httpProvider){
console.log($httpProvider.defaults.headers.common);
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$httpProvider.defaults.headers.post['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.headers.post['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.useXDomain = true;
}]);
Я делаю это снова в фактическом ресурсе:
return $resource('http://foo.com/getStuff', {}, {
fetch: {
method:'JSONP',
params: params,
headers: {
'Accept':'application/json, text/javascript',
'Content-Type':'application/json; charset=utf-8'
},
isArray:false,
callback: 'JSON_CALLBACK'
}
});
Но все же заголовки запроса содержатAccept: */*
.
Мой вопрос: ПОЧЕМУ? Почему Angular игнорирует мои заголовки? И как мне заставить его использовать правильные заголовки в любом случае?
А также: есть ли способ использовать JSONP в POST?
Редактировать: Первоначально я использовал Angular 1.0.7, но я просто попробовал его с 1.2.3 и получил те же результаты. Заголовки игнорируются, но все утверждают, что это способ сделать это.
Я также попытался сделать это напрямую с $ http, а не с $ resource, с теми же результатами.
Изменить 2: ВотJSFiddle, Он анонимный и не использует мой настоящий сервер, но с помощью инструментов Firebug / developer вы можете убедиться, что он отправляетAccept: */*
на оба звонка, несмотря на мои многочисленные попытки установитьapplication/json
заголовки. И это моя настоящая проблема здесь. На моем реальном сервере я получаю XML-результат из-за этого, несмотря на способность моего реального сервера отправлять JSON.
(Поддерживает ли реальный сервер jsonp на данный момент менее актуально. Этот фиктивный сервер явно нет, но это нормально. Я просто забочусь о заголовках.)
Изменить 3: Я пробовал оба решения, предложенные ниже:
$http.defaults.headers.common['Accept'] = 'application/json, text/javascript';
$http.defaults.transformRequest.push(function (data, headersGetter) {
headersGetter().Accept = "application/json, text/javascript";
return data;
});
Я попробовал оба утверждения отдельно. В контроллере, а затем в сервисе непосредственно перед вызовом http. Все еще не работает.
Может кто-нибудь дать мне JsFiddle, где это работает?
Изменить 4: Я заметил, что когда я использую GET, а не JSONP, заголовок Accept является правильным. Но тогда ответ отклоняется, потому что у него нет правильного заголовка.
Какие заголовки должен иметь вызов JSONP? Потому что в вызове JSONP гораздо больше заголовков, но нет ничего, что бы идентифицировало его как JSONP. Должен ли сервер иметь явную поддержку JSONP, чтобы это работало? Я внезапно осознаю, что недостаточно разбираюсь в jsonp.