【发布时间】:2019-04-29 19:41:06
【问题描述】:
我正在使用 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,并将IsBase64EncodedLambda 响应正确设置为true
如何让 APIG 对字符串进行 base64 解码?我发誓几个月前我第一次尝试这个时,我已经开始工作了。
注意:我也尝试将*/* 用作binary media types
一些相关的帖子添加背景:
- https://github.com/twitchtv/twirp/issues/81
- https://github.com/awslabs/aws-serverless-express/issues/39#issuecomment-276019222
更新:
事实证明,只有将 binary media type 设置为 */* 才能使其正常工作。客户端Accept 标头一旦设置为这个就没有影响。
使用*/* 会产生许多不良副作用,因为每个响应都试图被解码(即使 IsBase64Encoded 为 false 或未设置)
我认为这不是解码,因为 Chrome 网络检查工具将始终将二进制数据显示为在 Preview 选项卡中编码的 base64。您可以在Response 选项卡中看到 protobuf。
【问题讨论】:
-
您提到“使用 / 的许多不良副作用”,但我没有看到。你能帮我了解如何观察这些副作用吗?我在github.com/activescott/apig-lambda-proxy-binary-response 有一个简单的 repo,它演示了这一点,但我没有看到任何副作用(例如,在 html 函数响应上)。
-
我必须承认,我没有在非二进制响应上测试
*/*。我只是做了一个有根据的猜测,如果 APIG 被配置为这个,它会尝试对每个响应进行 base64 解码。既然您提到了这一点,我想知道 APIG 是否仅在IsBase64Encoded为真时才进行解码。然而,这在我的脑海中没有任何意义。如果是这种情况,为什么首先需要 APIGbinary media type。 -
感谢您的回复。我在这里试图通过同样的事情进行推理:) 我不得不承认,我不清楚需要
isBase64Encoded和binaryMediaTypes的需要/目的。当我确认它们时,我可能会继续修补并更新该 repo 并提供更多详细信息...... -
如果有人觉得它有帮助,我在github.com/activescott/apigateway-lambda-binary-response 专门创建了一个存储库,用于记录和演示使用 Amazon API Gateway + AWS Lambda 的二进制响应的各种详细信息。
标签: amazon-web-services aws-lambda aws-api-gateway