amazonS3 の署名済み URL に PUT リクエストを送信しようとしています。PUT リクエストが 1 つしかないのに、リクエストが 2 回呼び出されているようです。最初のリクエストは を返し200 OK
、2 番目のリクエストは を返します400 Bad Request
。
これが私のコードです:
var req = {
method: 'PUT',
url: presignedUrl,
headers: {
'Content-Type': 'text/csv'
},
data: <some file in base64 format>
};
$http(req).success(function(result) {
console.log('SUCCESS!');
}).error(function(error) {
console.log('FAILED!', error);
});
エラー400 Bad Request
の詳細:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>Bearer someToken</ArgumentValue>
<RequestId>someRequestId</RequestId>
<HostId>someHostId</HostId>
</Error>
理解できないのは、なぜ 400 が返されるのか、回避策は何なのかということです。
ベストアンサー1
おそらくクライアントは Authorization ヘッダーを使用する最初のリクエストを送信しており、302 で応答しています。レスポンスには、Signature パラメータを持つ Location ヘッダーが含まれています。問題は、最初のリクエストのヘッダーが後続のリダイレクト リクエストにコピーされ、Authorization と Signature の両方が含まれることです。後続のリクエストから Authorization を削除すれば、問題は解決するはずです。
これは私にも起こりましたが、Java / HttpClient 環境で発生しました。Java での解決策の詳細は提供できますが、残念ながら AngularJS では提供できません。