java - 如何从curl生成正确的RestTemplate用法?

标签 java spring amazon-web-services spring-boot curl

我有一个有效的curl命令如下:

curl -v  -H "Content-Type:application/octet-stream" \
         -H "x-amz-server-side-encryption:aws:kms" \
         -H "x-amz-server-side-encryption-aws-kms-key-id:abcdef81-abcd-4c85-b1d8-ee540d0a5f5d" \
         --upload-file /Users/fd/Downloads/video.mp4 \
         'https://video-uploads-prod.s3-accelerate.amazonaws.com/ABCDEAQGZHEhM55fvvA/ads-aws_userUploadedVideo?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200106T165718Z&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-server-side-encryption%3Bx-amz-server-side-encryption-aws-kms-key-id&X-Amz-Expires=86400&X-Amz-Credential=ABCDEFHLWTCWZ2MUPPBQ%2F20200106%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=037949abcd1234b063c75d3d505dd9120dd3fa9250c1ababa152e91fee123ca0'

curl 工作正常:

* We are completely uploaded and fine
< HTTP/1.1 200 OK

但是,当我尝试使用 RestTemplate (我使用的是 spring boot 1.5.6)时,我无法使其工作。我使用的代码是:

byte[] media = //video in mp4//;
String uploadUrl = "https://video-uploads-prod.s3-accelerate.amazonaws.com/ABCDEAQGZHEhM55fvvA/ads-aws_userUploadedVideo?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200106T165718Z&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-server-side-encryption%3Bx-amz-server-side-encryption-aws-kms-key-id&X-Amz-Expires=86400&X-Amz-Credential=ABCDEFHLWTCWZ2MUPPBQ%2F20200106%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=037949abcd1234b063c75d3d505dd9120dd3fa9250c1ababa152e91fee123ca0";

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.set("x-amz-server-side-encryption", encryption);
headers.set("x-amz-server-side-encryption-aws-kms-key-id", awsKmsKeyId);

HttpEntity entity = new HttpEntity<>(media, headers);

ResponseEntity<String> respEntity = restTemplate.exchange(uploadUrl, HttpMethod.POST, entity, String.class);

我从 AWS 得到的错误是:

<Error>
   <Code>AuthorizationQueryParametersError</Code>
   <Message>Error parsing the X-Amz-Credential parameter; the Credential is mal-formed; expecting "&lt;YOUR-AKID&gt;/YYYYMMDD/REGION/SERVICE/aws4_request".</Message>
   <RequestId>51FF099744C43804</RequestId>
   <HostId>FOlLws+txYMP0hKEg7aDjQeeARdn7bJN+lw7q/aGA48hRnr1YEsJrVmRi6oEz+mkpHlTIax5MkI=</HostId>
</Error>

我怀疑 RestTemplate 正在更改 URL 的编码。无论如何,是否可以使用 RestTemplate 复制与curl完全相同的内容?

最佳答案

您可以在 RestTemplate 中传递 URI 而不是 String,这应该会消除您的错误。这里也发生了同样的事情。

URI uri = URI.create(urlAsString);
Map response = new RestTemplate().exchange(uri, GET, new HttpEntity(headers), Map.class).getBody();

使用字符串时斜杠似乎被十六进制转义,因此 %2F 变为 %252F。直接传入 URI 可以避免这种情况。

关于java - 如何从curl生成正确的RestTemplate用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619288/

相关文章:

java - 文件系统为数据库字段分配的大小

c++ - 上传图像文件在 AWS S3 C++ SDK 上花费的时间太长

java - 有没有办法存储/缓存 InputStream?

java - 无法在 Spark 中配置 ORC 属性

java - 将 Room DB 与 Rx 结合使用时出现 CursorWindowAllocation 异常

java - 如何在不对值进行硬编码的情况下在 Java 中设置截止日期

java - 如何从 spring-cloud-netflix-feign 在 Feign-Client 中设置 HostnameVerifier

spring - 在生产中部署 Spring Boot

java - 如何使用 Spring Properties 配置 Velocity Escape Tool?

ios - swift 3 : Transfer Utility enumerateToAssignBlocks method signature