首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS API网关Lambda集成(非代理)-如何发送自定义报头和二进制数据

AWS API网关Lambda集成(非代理)-如何发送自定义报头和二进制数据
EN

Stack Overflow用户
提问于 2018-12-23 10:48:53
回答 1查看 886关注 0票数 1

我正在使用与Lambda集成的API网关。

注意:我不使用Lambda代理.

我需要从API网关返回一个二进制响应。我已成功地将其设置如下:

  1. 将二进制数据编码为base64 UTF-8字符串,并仅从lambda函数return "base64 encoded binary data"返回该数据。
  2. 在API网关集成响应上启用CONVERT_TO_BINARY
  3. 将API方法响应上的Content-Type头映射到二进制内容的二进制媒体类型
  4. 将二进制内容的媒体类型添加到API网关的二进制媒体类型列表中

问题是,除了发送二进制数据(我可以从上述步骤成功完成)外,我还需要在API响应中包含一个x-my-header自定义头。

我知道如何在API中设置标头映射,但是报头必须从数据库数据中计算,因此这个值也需要从lambda返回。

我对lambda集成的理解(请记住,这里我没有使用lambda代理)是API网关发出HTTP请求来触发lambda。然后Lambda向API返回一个HTTP响应,将输出的函数添加到主体中,并向响应中添加内部aws头。

现在可以使用以下方法将头映射到方法响应:

代码语言:javascript
运行
复制
integration.response.header.header-name

我的问题是..。

当我使用自定义lambda集成(而不是代理)时,我可以告诉lambda将我的自定义头添加到二进制响应中吗?

注意事项:如果i使用lambda代理,我知道返回对象如下所示,然后我将能够发送自定义头。但出于我无法控制的原因,我不能使用lambda代理。

如果Lambda I使用lambda代理,则返回对象解决方案

代码语言:javascript
运行
复制
return {
   'body': "base64 encoded binary data",
   'headers': 'x-my-header': 'my-value',
   'isBase64Encoded': True
}

对于Lambda Integration (不是代理),我尝试过修改lambda输出。

代码语言:javascript
运行
复制
return {
   "base64-data": "base64 encoded binary data",
   "x-my-header: "some value"
}

并在集成响应中建立映射模板.

代码语言:javascript
运行
复制
$input.json("$.base64-data")

并使用.建立头映射。

代码语言:javascript
运行
复制
integration.response.body.x-my-header

但是API网关返回一个错误:

代码语言:javascript
运行
复制
Execution failed due to configuration error: Unable to transform response

我认为发生此错误是因为当您启用CONVERT_TO_BINARY时,不存在映射模板。来自AWS文档:

当将文本有效负载转换为二进制blob时,API网关假设文本数据是Base64 64编码的字符串,并将二进制数据输出为经过Base64 64解码的blob。如果转换失败,则返回一个指示API配置错误的500个响应。您没有为这种转换提供映射模板,尽管您必须在API上启用传递行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-17 01:15:46

我意识到这是一个老问题,但最近遇到了一个类似的头映射问题,尽管我没有使用二进制数据。

在我看来,兰博达的回归可能是这样的

代码语言:javascript
运行
复制
{
  "base64-data": "base64 encoded binary data",
   "x-my-header: "some value"
}

基于Lambda响应,可以应用以下映射(我基于AWS示例修改了映射)

代码语言:javascript
运行
复制
$input.json("$.base64-data")
#set($context.responseOverride.header.x-my-header = "$input.json('$.x-my-header')")

$input.json("$")引用您的响应,$.key是引用您的子键的正确方法。

您还必须在您的方法响应中预先配置您的标题“x header”。

在集成响应中,标头映射可能只是一个空值。

代码语言:javascript
运行
复制
""

实际值将由由映射模板设置的覆盖($context.responseOverride.header)提供。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53902955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档