2016-04-16 50 views
1

我有curl命令:捲曲到Java的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' 

這是正常工作。 後來我想這樣做,但用的HttpClient:

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。我們計算的請求籤名與您提供的簽名不匹配。檢查你的密鑰和簽名方法。

回答

1

curl -T/--upload-file使用PUT(除非你指定-X/--request)不是POST,儘管服務器顯然不關心,因爲它通常會在內容之前抱怨方法;並且它會像Java那樣發送一個沒有錯誤標記multipart的實體。嘗試使用普通的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

您可以檢查出這個線程,

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

下面的線程兩項

如果這可以幫助任何人:我得到這個相同的簽名失敗,但這個錯誤我正在包含額外的HTTPS標頭(內容類型),它明顯用於計算簽名

本質上,我用來生成簽名查詢字符串參數的庫不是轉義的空間。所以,每隔一段時間就會生成一個包含空格的值 - 我會看到一個403.確保URI查詢字符串參數值的正確編碼完成了這個任務。