node.js - AWS lambda 函数代理从服务层获取二进制 blob (PDF) 的请求,然后返回给客户端
问题描述
我创建了一个 lambda 函数,以便我可以将其用于验证目的,然后将请求代理到服务层。然后服务层响应包含一个二进制 blob (PDF),它通过 lambda 函数,然后 API 网关最终到达客户端。
我们遇到的第一个问题是 PDF 被转换或损坏,只是返回了空白 PDF。然后我发现这篇文章起初对我没有任何意义。直到我看到这个 aws doc。事实证明,需要将二进制数据编码为 base64,然后将指标“isBase64Encoded”设置为 true。网关最终将响应转换回二进制 blob。
TBH,我是aws的新手,我真的不明白为什么会这样……通过原始二进制blob有什么问题,为什么这些转换步骤是必要的?
这是我必须做的事情的清单
- 配置/作为网关上的二进制媒体类型。(我尝试使用 application/pdf,但没有用?)
- 确保来自服务层的响应正文未转换为字符串(我使用的是request,默认情况下它给我字符串)。我
encoding: null
随请求一起发送 - 当我从服务层获取 Buffer 数据时,我使用Buffer将响应体转换为 base64 编码。
- 在 lambda 输出中,我设置
isBase64Encoded
为 true
最后,获取未更改的 PDF...
我想知道是否有人可以确认我正在以预期的方式做事?或者,如果有更好的方法?
另外,当我们将二进制支持媒体类型设置为/时,这是否意味着它接受所有媒体类型?但我只希望支持 PDF。
解决方案
该文档(https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html)应该能够回答您的问题。您需要注意两点:
- 您可以通过 API Gateway 传递原始二进制文件 (blob) 以及 base64 编码的二进制文件。参考:https ://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-content-encodings-examples-image-lambda.html
*/*
(或/
)适用于您的情况,但这意味着 API Gateway 会将所有有效负载视为二进制数据,这会将有效负载与文本数据(例如 JSON 有效负载)分开。因此,理想情况下application/pdf
应该用作“二进制媒体类型”。
推荐阅读
- python - os 从目录中删除除 .py 文件之外的任何文件
- c# - 在 Asp.Net Core 中为 IdentityDbContext 和 ApplicationDbContext 创建一个通用事务
- c# - F#:Marten 不加载聚合
- fortran - 如何解决 openmp fortrann77 的内存带宽问题
- swift - 使用 Swift 将数据分别加载到两个具有关系的 Core Data 实体中
- ios - 如何快速存储sqlite blob
- angular - 从 Firebase 存储中检索一组照片
- c# - 在 mvc 控制器上向开发人员隐藏模型变量/属性的值
- html - 初学者。为我自己的试验和错误制作了一个简单的网站。使用主机。无法获取用户注册页面输入以保存到某种类型的文件
- r - 如何在 readr/tidyverse 中设置 encoding/fileEncoding 选项?