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

时间:2017-03-13 13:34:10

标签: api amazon-web-services lambda proxy gateway

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

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

使用base64编码并让客户端浏览器解码它不是一个选项,因为这不是标准,可能无法在所有浏览器中使用。

我认为除非AWS为此添加新功能,否则我无法执行任何其他操作。有没有人调查过这个问题?有什么想法或建议吗?

2 个答案:

答案 0 :(得分:2)

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

答案:使用代理集成的二进制支持DOES WORK,它适用于传入和传出响应。

有3个与此相关的因素:

  1. APIG的二进制支持设置中的MIME类型(我在控制台上设置了这个)
  2. " isBase64Encoded"传入和传出JSON中的值
  3. "内容类型"传出JSON中的值
  4. 上面的答案意味着是的,你可以接受文件,是的,你可以通过代理集成来吐出文件。

    当用户发布消息时使用body,如果你设置的MIME类型与它匹配,APIG会在base64中对整个身体部分进行编码,并使用" isBase64Encoded"值。外向响应也会发生同样的事情。如果要使用二进制数据进行响应,可以在base64中对其进行编码,并在传出JSON中将该值设置为true。

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

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

答案 1 :(得分:0)

我遇到了类似的情况,Node lambda函数从服务层返回二进制blob(PDF)。

  1. 已配置/作为网关上的二进制媒体类型。 (我尝试使用application / pdf,但没有用?)
  2. 确保来自服务层的响应正文未转换为字符串(我使用的是请求,默认情况下它会为我提供字符串)。我发送编码:null和请求
  3. 当我从服务层获取Buffer数据时,我使用Buffer将响应主体转换为base64编码。
  4. 在lambda输出中,我将isBase64Encoded设置为true

参考:here