【问题标题】:AWS API Gateway with Lambda proxy always produces base64 string response带有 Lambda 代理的 AWS API Gateway 始终产生 base64 字符串响应
【发布时间】: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,并将 IsBase64Encoded Lambda 响应正确设置为 true

如何让 APIG 对字符串进行 base64 解码?我发誓几个月前我第一次尝试这个时,我已经开始工作了。

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

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

更新:

事实证明,只有将 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 为真时才进行解码。然而,这在我的脑海中没有任何意义。如果是这种情况,为什么首先需要 APIG binary 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


【解决方案1】:

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

关于使用 Lambda 代理处理二进制文件的文档不是很好,所以这里有一个简短的总结:

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

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

This blog post 将引导您逐步了解如何使其正常工作(不使用 CloudFront)。

This 是完整的 aws-blueprint,用于使用 CloudFront 获得生产级 ci/cd。

【讨论】:

  • 如果您无权设置请求标头,例如从浏览器调用,该怎么办?
猜你喜欢
  • 2017-12-03
  • 2017-10-04
  • 1970-01-01
  • 2015-12-04
  • 2018-11-13
  • 2018-06-03
  • 2021-01-08
  • 2015-10-21
  • 2018-12-02
相关资源
最近更新 更多