私が制御していない REST サービスにアクセスしようとしています。最初の問題は、サービスに Access-Control-Allow-Origin ヘッダーが含まれていないことです。これは、私が正しく理解している場合、すぐに JSONP に制限される問題です。
また、デフォルトでは、このサービスは JSON を送信できますが、JSON ではなく XML を送信します。私の Accept ヘッダーに応答する必要があると思います。サービスの責任者は、私の Content-Type を見ていると言っています。これは、GET ではなく POST を実行する必要があることを意味します (ただし、静的データを取得するだけの場合は 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 がヘッダーを無視するのはなぜですか? とにかく、適切なヘッダーを使用するにはどうすればよいですか?
また、POSTでJSONPを使用する方法はありますか?
編集:もともとAngular 1.0.7を使用していましたが、1.2.3で試してみたところ、同じ結果が得られました。ヘッダーは無視されますが、誰もがこれがその方法だと主張しています。
また、$resource ではなく、$http で直接実行しようとしましたが、同じ結果になりました。
編集 2:ここにJSFiddleがあります。匿名化されており、実サーバーは使用していませんが、Firebug/開発者ツールを使用すると、ヘッダーAccept: */*
を設定しようと何度も試みたにもかかわらず、両方の呼び出しで送信されることを確認できます。application/json
そして、それが私の本当の問題です。私の実サーバーでは、実サーバーが JSON を送信できるにもかかわらず、XML の結果を取得しています。
(実際のサーバーが 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: JSONP ではなく GET を使用すると、Accept ヘッダーが正しいことに気付きました。しかし、正しいヘッダーがないため、応答は拒否されます。
JSONP 呼び出しにはどのような種類のヘッダーが必要ですか? JSONP 呼び出しにはさらに多くのヘッダーがありますが、それを JSONP として識別するものは何もないためです。これを機能させるには、サーバーが明示的な JSONP サポートを持っている必要がありますか? 私はjsonpについてほとんど知らないことに突然気づきました。