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

ryn*_*nop 7 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
  • content-type: application/protobufIsBase64EncodedLambda响应,并将Lambda响应正确设置为true

如何使APIG对base64解码字符串?我发誓几个月前我第一次尝试这个功能时,我已经做到了。

注意:我也尝试*/*binary media types

一些相关的帖子添加背景:

更新:

事实证明,只有将binary media type设置为,我才能使它工作*/*。客户端Accept标头设置为此不会产生任何影响。

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

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

ryn*_*nop 9

问题是我在API Gateway之前使用CloudFront,并且没有将Accept标头传递给源(APIG)。

使用Lambda代理处理二进制文件的文档不是很好,所以这里是一个简短的摘要:

  • 您的客户必须发送Accept标头的第一种媒体类型与binary media types在API网关中设置的标头相匹配
  • 如果提供的是二进制媒体类型,则Lambda必须设置IsBase64Encoded为true,并且body必须使用base64编码

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

这篇博客文章将逐步指导您如何使其工作(不使用CloudFront)。

是完整的AWS蓝图,可通过CloudFront获得生产级ci / cd。

  • 如果您无权设置请求标头(例如从浏览器调用)怎么办? (2认同)