如何 return 1*1 像素作为 AWS Lambda 的响应?

How to return 1*1 pixel as response from AWS Lambda?

我正在尝试从我的 AWS Lambda 获取 1*1 像素作为响应。

代码是这样的:

var imgHex = '47494638396101000100800000dbdfef00000021f90401000000002c00000000010001000002024401003b';
var imgBuffer = new Buffer(imgHex, 'hex');
context.succeed({header:"image/png",data:img}); 

并且我在 API 网关 中映射了响应 header。 但它没有给出 1*1​​ 像素作为响应。

在集成响应中,将默认的 application/json 内容类型替换为 image/png,并将映射模板设置为:

#set($result = $input.path('$'))
$result.data

使用 curl -vvv https://yourendpoint.com/resource 查看返回的内容 headers。

API 网关目前不支持二进制数据。在从 Lambda 返回图像之前,您必须对图像进行 base64 编码,并在客户端对其进行解码。提供了一个示例 here.

里蒂莎。

终于拿到想要的了。

  • 不将 base64 字符串转换为十六进制,而是使用转义的十六进制 1px*1px 图像的表示。即向每个十六进制字符添加“\x”。
  • AWS Gateway目前不支持二进制数据,所以会添加 发送数据的额外字符。参见 this。所以你可能不会对每张图片都满意。
  • 这里我使用了bmp格式的图片。并得到 1*1 像素的图像作为 输出。
    不要忘记在集成响应中设置 Content-Type header。

    代码:

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 gateway 修改了你的字符串,有时你会得到这个图像
.
因此,只需使用 display:none CSS 隐藏您的图像。

<img style="display:none" src ="http://path_to_your_code">