我正在使用API Gateway Lambda代理集成,并尝试返回二进制application/protobuf
响应。不管我做什么,响应主体始终是base64编码的字符串
application/protobuf
设置为binary media types
POST
中发送以下标头:
Accept: application/protobuf
Content-Type: application/protobuf
content-type: application/protobuf
,并将IsBase64Encoded
Lambda响应正确设置为true
如何使APIG对base64解码字符串?我发誓几个月前我第一次尝试这个功能时就可以使用。
注意:我也尝试过将*/*
作为binary media types
一些相关帖子以添加背景
更新:
结果证明,只有将binary media type
设置为*/*
时,它才能正常工作。客户端Accept
标头设置为此不会产生任何影响。
使用*/*
会带来很多不利影响,因为尝试对每个响应进行解码(即使IsBase64Encoded为false或未设置)
我认为它没有解码,因为Chrome网络检查工具将始终在Preview
标签中将二进制数据显示为以base64编码的形式。您可以在Response
标签中看到原始气泡。
答案 0 :(得分:7)
问题是我在API网关前面使用CloudFront,但没有将Accept
头传递给源(APIG)。
使用Lambda代理处理二进制文件的文档并不出色,因此这里是一个简短的摘要:
Accept
标头,该标头是您在API网关中设置为binary media types
的那个1st media type matches IsBase64Encoded
设置为true,并且body
必须使用base64编码如果客户端Accept
标头与API Gateway的binary media types
中的条目匹配并且满足这些条件,则API Gateway将在发送响应到客户端之前进行转换(base64解码)。
This blog post分步介绍了如何使其工作(不使用CloudFront)。
This是aws-blueprint的完整代表,可以通过CloudFront获得生产级ci / cd。