如何 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">
我正在尝试从我的 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">