2016-04-16 14 views
1

私は、curlコマンドを持っている:カールのHTTPClient

curl -s -T '/orig.jpg' -H 'content-type:image/jpeg' 'https://amazonaws.com/d5OCmmq-MgbIPk6ZRqql4bZX3gZ2QhG8uum6YDdcZYcRtohs3ZIMxF1gR3rFcPEg1-Vz-v8hUuKATM6D_-FrtQ%3D%3D/orig.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJGCZOCB2ULPVHGAA%2F20160416%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20160416T202457Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=2dcfb2b843d484e50557d2da430e60512a49070bed219ae98970284ef735e02e' 

それが正常に動作しています。

File file = new File(imagePath); 
HttpPost post = new HttpPost(url); 
post.setHeader(HTTP.CONTENT_TYPE, "image/jpeg"); 
ContentBody fileBody = new FileBody(file, ContentType.create("image/jpeg")); 

MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
builder.addPart("orig.jpg", fileBody); 
HttpEntity entity = builder.build(); 

post.setEntity(entity); 
HttpResponse response = periscope.getClient().execute(post); 

応答::

SignatureDoesNotMatch は、その後、私は同じですが、とにHTTPClientを行いたいです。計算したリクエストの署名が、あなたが指定した署名と一致しません。あなたのキーと署名方法を確認してください。

答えて

1

curl -T/--upload-fileは、POSTではなくPUTを使用します(ただし、-X/--requestを指定しない限り)。サーバーはコンテンツの前にメソッドについて一般的に不平を言っているので、サーバーは気にしません。あなたのJavaのように、マルチパートのラベルが間違っていない単一のエンティティを送信します。プレーンFileEntityを使ってみてください。また、自動的にコンテンツタイプを設定することもできます。具体的には:

HttpPost post = new HttpPost(url); // or maybe Put 
post.setEntity (new FileEntity (file, ContentType.create("image/jpeg"))); 
... client.execute(post); 
+0

ありがとう、私はHttpPutとsetEntity()メソッドを使用して今すぐ動作します –

1

あなたは、これは誰にも役立ちます場合は、スレッド

に、2つのエントリの下

https://github.com/aws/aws-sdk-js/issues/86

を、このスレッドをチェックアウトすることができます:私はこれと同じシグネチャの失敗を得ていたが、間違いは私が作っていました明らかに署名を計算するために使用される余分なHTTPSヘッダー(Content-type)を含んでいた。

本質的には、Signatureクエリ文字列パラメータを生成するために使用していたライブラリがエスケープしていなかったスペース。したがって、スペースを含む値が頻繁に生成され、403が表示されます。URIクエリ文字列パラメータ値の適切なエンコーディングを保証することがトリックでした。