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.

Ответы на вопрос(3)

Ваш ответ на вопрос