【问题标题】:Returning images through AWS API Gateway通过 AWS API Gateway 返回图像
【发布时间】:2015-10-15 10:24:11
【问题描述】:

我正在尝试使用 AWS API Gateway 作为图像服务前的代理。 我能够让图像通过,但它显示为一大块 ASCII,因为 Content-Type 设置为“application/json”。

有没有办法告诉网关根本不要更改源 Content-Type?

我只想让“image/jpeg”、“image/png”等通过。

【问题讨论】:

  • 为什么选择 API 网关?您的图像服务在 Lambda 中运行?另外,“源”内容类型?大概您指的是“响应”。
  • 是否有特定原因必须由 Lambda 返回图像?另一种方法是让 Lambda 函数将图像上传到 S3 并返回指向该图像的链接。
  • @Michael-sqlbot:我可以用其他东西创建一个代理,但我需要维护它。 AWS 大概可以处理我可能施加的任何负载。另外,缓存可能很有用。首先需要一个代理是谷歌搜索看到我的页面上的资产来自我公司的其他服务(搜索引擎优化的人说他们认为我们正在抓取)。我们需要使用相同的资产,所以我只想让它看起来像是来自不同的地址。这个东西不需要 lambda/操作,只是一个代理。如果您可以推荐其他服务,我会检查一下。
  • @JaredHatfield:不使用 lambda。只是 [也许] API Gateway 独立。
  • 请注意,您不能(天真地)通过 API 网关返回二进制数据。见:stackoverflow.com/a/37639963/358224

标签: amazon-web-services aws-api-gateway


【解决方案1】:

我试图格式化要返回的不带引号的字符串,并发现了集成响应功能。我自己没有尝试过这个修复,但是这些方面的东西应该可以工作:

  • 转到资源的方法执行页面,
  • 点击集成响应,
  • 展开方法响应状态 200,
  • 展开映射模板,
  • 点击“应用程序/json”,
  • 点击Output Passthrough旁边的铅笔,
  • 将“application/json”更改为“image/png”

希望它有效!

【讨论】:

【解决方案2】:

我提前道歉,因为给出的答案没有直接回答问题,而是建议您采用不同的方法......但基于问题和 cmets,以及我自己对我认为是的经验类似的应用程序,您似乎使用了错误的工具来解决问题,或者至少是在 AWS 生态系统中不是最佳选择的工具。

如果您的图像服务在 Amazon Lambda 中运行,则对 API Gateway 的需求会更加明显。没有它,我看不到它。

Amazon CloudFront 提供从后端服务器获取内容、缓存内容(在全球超过 50 个“边缘”位置)、缓存内容的存储免费,并且您可以配置多达 100 个不同的主机名指向除了默认的 xxxxxxxx.cloudfront.net 主机名之外,还有一个 Cloudfront 分发。它还支持 SSL。这似乎是您正在尝试做的事情,然后是一些。

我使用它,非常成功地用于您描述的场景:“图像服务前面的代理”。我的图像服务和您的图像服务所做的确切内容可能不同(我的图像服务是一个调整大小,可以在请求的图像、获取和调整大小之前查找丢失/从未有过的源 URL)但从根本上看起来我们正在完成类似的目的.

奇怪的是,CloudFront 在某些地区(例如 us-east-1 和 us-west-2)的定价结构不仅具有成本效益,而且实际上使用 CloudFront 的价格几乎可以达到 0.005 美元比不使用它便宜每GB下载。

就我而言,除了后端图像服务之外,我还有一个 S3 存储桶,其中包含一个文件,附加到 CloudFront 分配中的单个路径(作为第二个“自定义源”),用于提供/robots.txt 的唯一目的是控制行为良好的爬虫对我的图像的直接访问。这允许将 robots.txt 文件与图像服务本身分开管理。

如果这似乎无法满足您的需求,请随时发表评论,我将澄清或撤回此答案。

【讨论】:

  • 我不愿将其标记为“正确”答案,因为我仍然对使用 AWS API Gateway 维护 Content-Type 感到好奇,但这绝对有帮助,并且是我最终要做的。
  • @kjs3 我很高兴它有帮助,我一点也不怪你。随时等待更直接的答案。你的问题很有趣,也许我们会得到一个更准确的答案。如果我有机会对 AWS API Gateway 进行更广泛的测试,我会报告我的发现。
【解决方案3】:

@kjsc:我们终于弄清楚了如何使用 base64 编码的图像数据解决另一个问题,您可能会发现这对您的解决方案很有帮助:

AWS Gateway API base64Decode produces garbled binary?

要回答您的问题,要将 Content-Type 作为硬编码值通过,您首先需要进入方法响应屏幕并添加 Content-Type 标头和您想要的任何内容类型。

然后您将进入集成响应屏幕并将内容类型设置为您想要的值(在本例中为 image/png)。将 'image/png' 用单引号括起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 2016-02-10
    • 2019-08-24
    • 2019-05-24
    • 2017-04-13
    • 2018-04-23
    • 2017-04-19
    • 2019-10-25
    相关资源
    最近更新 更多