卷曲到Java httpclient

时间:2016-04-16 20:54:30

标签: java curl apache-commons-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);

响应:

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

2 个答案:

答案 0 :(得分:1)

你可以查看这个帖子,

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

线程中的两个条目

如果这有助于任何人:我遇到了同样的签名失败,但我犯的错误是包含一个额外的HTTPS标题(内容类型),显然用于计算签名

基本上,我用来生成签名查询字符串参数的库不是转义空格。因此,每隔一段时间生成一个包含空格的值 - 我会看到403.确保正确编码URI查询字符串参数值就可以了。

答案 1 :(得分: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);