【问题标题】:Curl to Java httpclient卷曲到 Java httpclient
【发布时间】:2016-04-16 20:54:30
【问题描述】:

我有 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。我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

【问题讨论】:

    标签: java curl apache-commons-httpclient


    【解决方案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);
    

    【讨论】:

    • 谢谢,我使用了 HttpPut 和 setEntity() 方法,现在可以使用了
    【解决方案2】:

    你可以看看这个帖子,

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

    线程中的两个条目以下

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多