使用 Spring RestClient 调用 AWS S3 预先设计的链接时出现错误请求错误

问题描述 投票:0回答:1

我正在尝试使用(新的)Spring RestClient 对 AWS S3 预先设计的链接进行 GET 调用。

来自 AWS 文档的此类链接示例:

enter image description here

https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>

按原样使用链接时(即作为传递给在restClient.get()之后调用的.uri()方法的字符串)我收到:

[400 Bad Request: "<?xml version="1.0" encoding="UTF-8"?><EOL><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>

我尝试了不同的方法,并注意到传递未编码的 X-Amz-Credential 值(因此使用斜杠而不是 %2F),使用 UriComponentsBuilder 和 .queryParam() 或 .replaceQueryParam() 方法不会导致此错误。

然而,出现了一个新错误,这次与 X-Amz-Security-Token 参数相关:

"<?xml version="1.0" encoding="UTF-8"?><EOL><Error><Code>InvalidToken</Code><Message>The provided token is malformed or otherwise invalid.<Token-0>TOKEN VALUE PRINTED HERE</Token-0></Message>

在这种情况下,以类似的方式传递 X-Amz-Security-Token 的未编码值没有帮助,会发生相同的错误。

在我看来,X-Amz-Security-Token 的问题也可能与编码相关,因为所有其他查询参数不包含需要编码的字符,并且 AWS API 不会抱怨它们。

但是,发送编码的查询参数可能会导致问题,这很奇怪,因为这显然是正确的方法。 当然,当使用curl或Bruno发送呼叫时,我对这些链接没有任何问题,我总是收到有效的回复。

知道什么可能有帮助吗?

spring-mvc amazon-s3 spring-restclient
1个回答
0
投票

问题确实与编码有关。 在这种情况下,正确的方法是基于完整的编码链接创建一个 URI 对象,并在 Rest 客户端中使用此 URI。

这可以通过以下方式实现:

UriComponentsBuilder.fromUriString(url).build(true).toUri();

即如文档所述,将 true 传递给 build() 方法:

参数: 编码 – 此构建器中的组件是否已经编码

© www.soinside.com 2019 - 2024. All rights reserved.