如何从 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 像素作为响应? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的 EC2 实例调用 AWS Lambda 函数?

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

AWS Lambda 返回权限被拒绝尝试从 S3 存储桶获取对象

如何通过 AWS HTTP API 向 Lambda 发送参数

如何在 Python 中从 AWS 中的 lambda 函数返回二进制数据?

如何确定AWS Lambda函数中的当前区域?