带有Lambda代理的AWS API Gateway始终会产生base64字符串响应

时间:2018-11-28 00:23:21

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

我正在使用API​​ Gateway Lambda代理集成,并尝试返回二进制application/protobuf响应。不管我做什么,响应主体始终是base64编码的字符串

  • 我在APIG中将application/protobuf设置为binary media types
  • 我的客户端(javascript)正在POST中发送以下标头: Accept: application/protobuf Content-Type: application/protobuf
  • 我的lambda响应content-type: application/protobuf,并将IsBase64Encoded Lambda响应正确设置为true

如何使APIG对base64解码字符串?我发誓几个月前我第一次尝试这个功能时就可以使用。

注意:我也尝试过将*/*作为binary media types

一些相关帖子以添加背景

更新

结果证明,只有将binary media type设置为*/*时,它才能正常工作。客户端Accept标头设置为此不会产生任何影响。

使用*/*会带来很多不利影响,因为尝试对每个响应进行解码(即使IsBase64Encoded为false或未设置)

我认为它没有解码,因为Chrome网络检查工具将始终在Preview标签中将二进制数据显示为以base64编码的形式。您可以在Response标签中看到原始气泡。

1 个答案:

答案 0 :(得分:7)

问题是我在API网关前面使用CloudFront,但没有将Accept头传递给源(APIG)。

使用Lambda代理处理二进制文件的文档并不出色,因此这里是一个简短的摘要:

  • 您的客户端必须发送一个Accept标头,该标头是您在API网关中设置为binary media types的那个1st media type matches
  • 您的Lambda如果提供二进制媒体类型,则必须将IsBase64Encoded设置为true,并且body必须使用base64编码

如果客户端Accept标头与API Gateway的binary media types中的条目匹配并且满足这些条件,则API Gateway将在发送响应到客户端之前进行转换(base64解码)。

This blog post分步介绍了如何使其工作(不使用CloudFront)。

Thisaws-blueprint的完整代表,可以通过CloudFront获得生产级ci / cd。