如何从 AWS Lambda 返回 1*1 像素作为响应? [复制]
Posted
技术标签:
【中文标题】如何从 AWS Lambda 返回 1*1 像素作为响应? [复制]【英文标题】:How to return 1*1 pixel as response from AWS Lambda? [duplicate] 【发布时间】:2016-12-16 13:59:37 【问题描述】:我正在尝试从我的 AWS Lambda 获取 1*1 像素作为响应。
代码是这样的:
var imgHex = '47494638396101000100800000dbdfef00000021f90401000000002c00000000010001000002024401003b';
var imgBuffer = new Buffer(imgHex, 'hex');
context.succeed(header:"image/png",data:img);
我在 API Gateway 中映射了响应标头。 但它不会给出 1*1 像素作为响应。
【问题讨论】:
也许改用重定向? 【参考方案1】:在集成响应中,将默认的 application/json 内容类型替换为 image/png 并将映射模板设置为:
#set($result = $input.path('$'))
$result.data
使用 curl -vvv https://yourendpoint.com/resource 查看返回的标题。
【讨论】:
此修复对您有用吗? 我已经尝试过上述修复。但我没有得到想要的像素作为响应。 curl 返回什么? 我得到了修改后的输出。看到这个***.com/questions/38897368/…【参考方案2】:API Gateway 目前不支持二进制数据。在从 Lambda 返回图像之前,您必须对图像进行 base64 编码,并在客户端对其进行解码。 here 提供了一个示例。
丽莎。
【讨论】:
信息量很大。但在这种情况下,我没有使用 javascript。所以我以另一种方式找到了解决方案。看到这个***.com/a/38911642/4639822【参考方案3】:终于得到了想要的结果。
不要将 base64 字符串转换为十六进制,而是使用转义的十六进制 1px*1px 图像的表示。即在每个十六进制字符中添加“\x”。 AWS Gateway 目前不支持二进制数据,所以会添加 正在发送的数据的额外字符。见this。因此,您可能不会对每张图像都感到满意。这里我使用 bmp 格式的图像。得到 1*1 像素的图像为 输出。 不要忘记在集成响应中设置 Content-Type 标头。
代码:
exports.handler = function(event, context)
var imageHex = "\x42\x4d\x3c\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00"+
"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x18\x00\x00\x00"+
"\x00\x00\x06\x00\x00\x00\x27\x00\x00\x00\x27\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00";
context.succeed(responce:imageHex,header:"image/bmp");
;
注意: 如果您正在处理新项目并且只想使用 lambda 函数,那么还有一个技巧。您可以将任何格式的图像(如 png、bmp、gif 等)作为转义的十六进制字符串。唯一的问题是 aws 网关会修改您的字符串,有时您会得到这张图片 . 因此,只需使用 display:none CSS 隐藏您的图像。
<img style="display:none" src ="http://path_to_your_code">
【讨论】:
以上是关于如何从 AWS Lambda 返回 1*1 像素作为响应? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
aws 如何从生产环境中的 lambda 函数访问 ECS 服务
AWS Lambda 返回权限被拒绝尝试从 S3 存储桶获取对象
如何通过 AWS HTTP API 向 Lambda 发送参数