我正在使用与Lambda集成的AWS API Gateway。
注意:我没有使用Lambda代理。
我需要从API网关返回一个二进制响应。我已成功将其设置如下:
return "base64 encoded binary data"
返回它CONVERT_TO_BINARY
Content-Type
标头映射到我的二进制内容的二进制媒体类型问题在于,除了发送二进制数据(我可以通过上述步骤成功完成此操作)之外,我还需要在API响应中包含一个x-my-header
自定义标头。
我知道如何在API网关中设置标头映射,但是必须从数据库数据中计算标头,因此也需要从lambda返回此值。
我对lambda集成的理解(请记住,这里我没有使用lambda代理)是API网关发出HTTP请求来触发lambda。 Lambda然后将HTTP响应返回到API网关,将输出函数添加到主体,还向响应添加内部aws标头。
现在可以使用以下方法将标头映射到方法响应:
integration.response.header.header-name
我可以告诉lambda将我的自定义标头添加到二进制响应中吗 使用自定义lambda集成(而非代理)?
注意:如果,我正在使用lambda代理,我知道返回对象如下所示,那么我将能够发送自定义标头。但是出于无法控制的原因,我不能使用lambda代理。
Lambda返回对象解决方案如果,我正在使用lambda代理:
return {
'body': "base64 encoded binary data",
'headers': 'x-my-header': 'my-value',
'isBase64Encoded': True
}
对于Lambda集成(不是代理),我尝试过修改lambda输出...
return {
"base64-data": "base64 encoded binary data",
"x-my-header: "some value"
}
并在集成响应中设置映射模板...
$input.json("$.base64-data")
并使用...设置标题映射
integration.response.body.x-my-header
但是API网关返回错误:
Execution failed due to configuration error: Unable to transform response
我相信会发生此错误,因为启用CONVERT_TO_BINARY
时将没有映射模板。来自AWS文档:
将文本有效内容转换为二进制Blob时,API Gateway假定文本数据是Base64编码的字符串,并将二进制数据输出为Base64解码的Blob。如果转换失败,则返回500响应,指示API配置错误。尽管必须在API上启用传递行为,但您不提供用于此类转换的映射模板。
答案 0 :(得分:0)
我意识到这是一个老问题,但是即使我没有使用二进制数据,最近我也遇到了类似的标头映射问题。
在我看来,Lambda的回报可能像这样
{
"base64-data": "base64 encoded binary data",
"x-my-header: "some value"
}
基于该Lambda响应,您可以应用以下映射(我根据AWS example对其进行了修改)
$input.json("$.base64-data")
#set($context.responseOverride.header.x-my-header = "$input.json('$.x-my-header')")
$ input.json(“ $”)引用您的响应,而$。[key]是引用子键的正确方法。
您还必须在方法响应中预先配置标题“ x-my-header”。
在集成响应中,标头映射只能是一个空值-例如
""
实际值将由映射模板设置的覆盖($ context.responseOverride.header)提供。