卷曲到 Java httpclient

Curl to Java httpclient

我有 curl 命令:

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);

回复:

签名不匹配。我们计算出的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

你可以看看这个帖子,

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

低于线程中的两个条目

万一这对任何人都有帮助:我遇到了同样的签名失败,但我犯的错误是包含了一个额外的 HTTPS header (Content-type),这显然是用来计算签名的

本质上,我用来生成 Signature 查询字符串参数的库没有转义 spaces。因此,每隔一段时间就会生成一个包含 space 的值 - 我会看到一个 403。确保 URI 查询字符串 parameter-values 的正确编码就成功了。

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);