rjm*_*urt 15 amazon-web-services aws-api-gateway
我正在尝试从AWS API Gateway方法返回1px gif.
由于现在支持二进制数据,我使用以下"集成响应"映射返回image/gif:
$util.base64Decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")
Run Code Online (Sandbox Code Playgroud)
但是,当我在Chrome中查看此内容时,我会看到返回以下二进制文件:
代替:
任何人都可以帮助我理解为什么这是乱码和错误的长度?或者我能做些什么来返回正确的二进制文件?还有其他一些我总是可以返回这个1px gif而不使用base64Decode函数?
非常感谢,这给我带来了很大的痛苦!
编辑
这个变得陌生.看起来问题不在于base64Decode,而在于二进制的一般处理.我在这篇博客文章和Stack Overflow问题之后添加了一个Lambda后端(之前我正在使用Firehose).我按照本文档页面将图像设置为binaryMediaType .
这让我可以通过Gateway API从Lambda传递以下图像/ bmp像素,它可以正常工作:
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.done(null, { "body":imageHex });
};
Run Code Online (Sandbox Code Playgroud)
但是,以下代表图像/ png或图像/ gif的图像在通过时会出现乱码:
exports.handler = function(event, context) {
//var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\xff\xff\xff\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x01\x44\x00\x3b";
//var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff\x00\x00\x00\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b";
var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b\x0a"
context.done(null, { "body":imageHex });
};
Run Code Online (Sandbox Code Playgroud)
这似乎与另一个Stack Overflow问题是同一个问题,但我希望这可以通过Gateway API二进制支持来解决.不幸的是,image/bmp对我的用例不起作用,因为它不能透明......
如果它可以帮助任何人,这是一个很好的工具,用于在base64和hex之间进行转换.
小智 20
对于其他任何有这个问题的人:我还在试图通过lambda的 API网关代理集成检索二进制图像,但是后来我注意到它在Lambda控制台的二进制支持部分中说:
API网关将查看Content-Type和Accept HTTP标头以决定如何处理正文.
所以我添加Accept: image/png
到请求标题,它工作.哦快乐,快乐!无需手动将内容处理更改为CONVERT_TO_BINARY或使用cli进行清理.当然,这排除了使用,例如,<img src=
直接(不能设置标题).
因此,为了通过代理集成从lambda获取API网关上的二进制文件:
isBase64Encoded
属性设置为true
码:
callback(null, {
statusCode: 200,
headers: { 'Content-Type': 'image/png' },
body: buffer.toString('base64'),
isBase64Encoded: true
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*ple 12
看起来这是以前的一个已知问题:https: //forums.aws.amazon.com/thread.jspa?messageID = 668306
但现在他们应该可以添加对二进制数据的支持:http: //docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html
看起来这就是我们需要的位:"将IntegrationResponse资源的contentHandling属性设置为CONVERT_TO_BINARY,以使响应有效负载从Base64编码的字符串转换为其二进制blob".那我们就不需要这个base64Decode()
功能了.
现在正在进行测试,看看是否有效.
编辑:我终于能够得到这个工作.你可以在这里看到二进制图像:https: //chtskiuz10.execute-api.us-east-1.amazonaws.com/prod/rest/image
这是我的Lambda函数,它将base64编码的PNG作为字符串返回:https: //gist.github.com/davemaple/73ce3c2c69d5310331395a0210069263
最后一步很棘手:将contentHandling
属性设置为"CONVERT_TO_BINARY".我无法弄清楚如何在AWS控制台中执行操作.我必须使用CLI API来完成此任务:
aws apigateway update-integration-response \
--profile davemaple \
--rest-api-id chtskiuzxx \
--resource-id ki1lxx \
--http-method GET \
--status-code 200 \
--patch-operations '[{"op" : "replace", "path" : "/contentHandling", "value" : "CONVERT_TO_BINARY"}]'
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
归档时间: |
|
查看次数: |
11094 次 |
最近记录: |