如何使用代理集成从AWS API Gateway提供二进制数据?

gin*_*i09 8 api proxy lambda gateway amazon-web-services

我正在使用AWS API Gateway(APIG)和Lambda函数构建无服务器的Web站点.我必须使用代理集成,因为后面的Lambda函数必须接收http请求标头.同时,需要提供一些二进制数据.就我而言,favicon.ico文件.其他人可能想要提供动态创建的PDF或Excel文件.APIG为此目的提供二元支持.使用base64对数据进行编码并配置该MIME内容类型,以便在将其提供给客户端之前对其进行解码.但是,这不适用于代理集成.代理集成只是跳过集成响应部分.

我尝试将favicon.ico的请求重定向到S3端点,但浏览器显示奇怪的行为.因为ico文件来自不同的重定向域,而不是同一个域.

使用base64对其进行编码并让客户端浏览器对其进行解码不是一种选择,因为这不是标准的,并且可能无法在所有浏览器中使用.

我认为在AWS为此添加新功能之前我无法做任何其他事情.有没有人调查过这个问题?有什么想法或建议吗?

gin*_*i09 5

在这里回答我自己的问题。您应该访问 AWS 论坛以获取 AWS 问题。这里不是很多 AWS 用户。

答案:代理集成的二进制支持确实有效,它适用于传入和传出响应。

有3个因素与此相关:

  1. APIG 二进制支持设置中的 MIME 类型(我在控制台上设置)
  2. 传入和传出 JSON 中的“isBase64Encoded”值
  3. 传出 JSON 中的“内容类型”值

上面的答案意味着是的,您可以接受文件,再次是的,您可以通过代理集成吐出文件。

当用户“发布”带有正文并且您设置的 MIME 类型与其匹配时,APIG 会以 base64 对整个正文部分进行编码,并用“isBase64Encoded”值表示这一点。同样的事情也会发生在传出的响应上。如果您想使用二进制数据进行响应,请使用 base64 对其进行编码,并在传出的 JSON 中将该值设置为 true。

对于传入请求,它仅取决于一个因素,即您设置的 MIME 类型。对于传出,JSON 中的指示符和 MIME 类型这两个条件必须匹配。

为简单起见,我只是将 MIME 类型设置为*/*. 每当用户提交正文中的任何内容时,让 APIG 编码然后我解码。每当我用二进制响应时,我只需设置指标并以 base64 编码。我不会对其他类型(例如 test/html(未压缩))执行此操作。

  • 啊,终于……我在 API 的“设置”部分将“应用程序/pdf”设置为“二进制媒体类型”。这需要 `Accept` 标头。但是将媒体类型更改为 `*/*` 意味着不需要 `Accept` 标头(至少是 Chrome)。好的。虽然这可能会干扰返回 JSON。一心一意。 (2认同)