Curl到javahttpclient

Curl到javahttpclient,java,curl,apache-commons-httpclient,Java,Curl,Apache Commons 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=AKIAJGCZOCB

我有一个命令:

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头(内容类型),这显然是用来计算签名的

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

curl-T/--upload file
使用PUT(除非您指定
-X/--request
)而不是POST,尽管服务器显然并不在意,因为它通常会在内容之前抱怨方法;它发送一个实体,而不是像Java那样错误地标记多部分。尝试使用普通文件实体。它还可以自动设置内容类型,您不需要这样做。具体而言:

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

谢谢,我使用了HttpPut和setEntity()方法,现在可以使用了