2016-04-16 11 views
1

Ich habe curl Befehl:Locken auf 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' 

Es ist funktioniert gut. Dann möchte ich das gleiche tun, sondern mit 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); 

Antwort:

SignatureDoesNotMatch. Die von uns berechnete Anforderungssignatur stimmt nicht mit der von Ihnen angegebenen Signatur überein. Überprüfen Sie Ihren Schlüssel und die Signiermethode.

Antwort

1

curl -T/--upload-file verwendet PUT (außer Sie angeben) nicht POST, obwohl der Server anscheinend nicht interessiert, weil es in der Regel über Methode vor Inhalt beschweren würde; und es sendet eine einzelne Entität, die nicht mehr als Multiple-Zeichen-Marke ist, wie es bei Java der Fall ist. Verwenden Sie eine einfache FileEntity. Außerdem kann der Inhaltstyp automatisch festgelegt werden. Dies ist nicht erforderlich. Speziell:

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

Vielen Dank, ich benutze HttpPut und setEntity() -Methode und es funktioniert jetzt –

1

Sie können diesen Thread Check-out,

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

Unten zwei Einträge in dem Thread

Falls das hilft jemand: Ich habe das gleiche Unterschrift Scheitern immer, aber der Fehler, den ich machte war ein zusätzlicher HTTPS-Header (Content-Typ), der offensichtlich zur Berechnung der Signatur verwendet wird

Im Wesentlichen die Bibliothek, die ich verwendet habe, um den Signature Query String-Parameter zu generieren wurde nicht entkommen Räume. Also, manchmal wurde ein Wert erzeugt, der ein Leerzeichen enthielt - und ich würde ein 403 sehen. Die richtige Codierung der Parameter-Werte der URI-Abfrage-Zeichenkette zu gewährleisten, war der Trick.