用于GET Bucket(列出对象)请求的S3 URL示例

时间:2017-07-27 16:59:34

标签: url amazon-s3

使用this documentation我设法生成网址以从我的存储桶中获取对象。我正在以下面的方式生成一个规范请求:

            String canonicalRequest = 'GET' + '\n'
                + key + '\n'
                + 'X-Amz-Algorithm=' + algorithm
                + '&X-Amz-Credential=' + credential
                + '&X-Amz-Date=' + creationDateTime
                + '&X-Amz-Expires=' + expires
                + '&X-Amz-SignedHeaders=host\n'
                + 'host:' + bucketName + '.s3.amazonaws.com\n\n'
                + 'host\n'
                + 'UNSIGNED-PAYLOAD';

在执行期间,它看起来像:

GET
/123/white.jpg
X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...%2F...%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20170727T162258Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
host:b0gdan1.s3.amazonaws.com

host
UNSIGNED-PAYLOAD

工作正常。有一个输出URL的例子:

https://b0gdan1.s3.amazonaws.com/123/white.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...%2F20170727%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20170727T162258Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=...

当我使用空字符串作为此示例的键时,它会返回我的存储桶中所有对象的列表。但是,我必须以某种方式通过前缀过滤对象。换句话说,我必须创建一个GET请求来列出我的存储桶中的前缀过滤对象。 This documentation看起来很好。但是,它仅包含规范请求。我不知道我的网址应该是什么样子。 我对此案的规范要求是:

            String canonicalRequest = 'GET \n'
                + '/?list-type=2&prefix='+ prefix + '\n'
                + 'X-Amz-Credential=' + credential
                + '&X-Amz-Date=' + creationDateTime
                + '&X-Amz-Expires=' + expires + '\n'
                + '&X-Amz-SignedHeaders=host\n'
                + 'host:' + bucketName + '.s3.amazonaws.com\n\n'
                + 'host\n'
                + 'UNSIGNED-PAYLOAD';

在执行期间,它看起来像:

GET
/?list-type=2&prefix=123
X-Amz-Credential=...%2F20170727%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20170727T164952Z&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
host:b0gdan1.s3.amazonaws.com

host
UNSIGNED-PAYLOAD

比我使用此网址:

https://b0gdan1.s3.amazonaws.com/?list-type=2&prefix=123&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...%2F20170727%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20170727T164412Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=...

但它返回SignatureDoesNotMatch错误。我尝试了许多规范请求和URL的变体,甚至比现有的更奇怪,但我运气不错。如果有人提供了一个列出存储桶对象的示例URL,那就太好了。如果我需要提供任何其他详细信息来解释我的问题,请告诉我。

我知道我可以使用AWS SDK for Java之类的东西来实现它,但我没有机会这样做。

0 个答案:

没有答案