【问题标题】:get JSON response using AWS presigned url使用 AWS 预签名 URL 获取 JSON 响应
【发布时间】:2016-09-21 00:00:56
【问题描述】:

我可以像这样生成一个预签名的网址

import boto3
s3 = boto3.client('s3')
url = s3.generate_presigned_url( ClientMethod='list_objects', Params={'Bucket':'bucket-name'} )

# now get the listing
import requests
r = requests.get(url)

# r.status_code is 200
# Problem:  r.text output is in XML format

当我直接调用 s3.list_objects(Bucket='bucket-name') 时,我会收到 JSON 格式的响应。生成 url 时没有指定内容类型的选项。我尝试使用 accept: application/json 更新请求的标头,但这会导致 AWS 出现“SignatureDoesNotMatch”错误。

最终我将使用带有 javascript 的 URL 客户端。这个例子只是为了说明问题。

使用预签名 URL(最好使用 boto)时,如何以 JSON 格式获取响应?看来应该可以了。

【问题讨论】:

  • 要提示 API 以 JSON 格式返回响应,您通常发送 Accept: application/json -- 而不是 Content-Type:。但是,S3 不会生成 JSON 响应。
  • 啊,对,是的,我也尝试设置 Accept 标头,但没有成功。

标签: amazon-s3 boto3


【解决方案1】:

没有办法做到这一点,S3 只返回 XML。 boto3 具有响应解析,可将其转换为字典以便于使用。

【讨论】:

  • 我在他们的文档中找不到任何说明这一点的内容。我使用他们的 REST API 测试了一个调用并返回了 XML,即使 Accept 标头设置为 application/json,所以显然这是正确的。如果您可以添加对文档的引用,我会接受这个作为答案。
  • lps,他们的文档中没有明确说“我们只是 XML”的地方。但是,他们也没有记录能够返回 JSON。 Here 是您提出的请求的文档页面。请注意,所有记录在案的响应都是 XML,并且没有记录的机制可以改变它。
猜你喜欢
  • 1970-01-01
  • 2022-06-22
  • 2018-02-01
  • 1970-01-01
  • 2020-10-09
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多