2015-10-19 69 views
1

我使用AWS拉姆达打乱了我的编码

https://clifff.com/2015/10/01/2015-failed-experiments-with-aws-lambda/ + https://www.twilio.com/blog/2015/09/build-your-own-ivr-with-aws-lambda-amazon-api-gateway-and-twilio.html

创建图像在AWS上拉姆达调整服务......我解决了内容类型问题的第一篇文章被卡住在,但编码似乎是一个死胡同......任何帮助将不胜感激!

红宝石

Base64.decode64("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 

- >工作的图像

GIF89a\u0001\u0000\u0001\u0000\x80\u0000\u0000\u0000\u0000\u0000\xFF\xFF\xFF!\xF9\u0004\u0001\u0000\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0001D\u0000; 

$util.base64Decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 

API网关 - >断图像

GIF89a\u0001\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000���!�\u0004\u0001\u0000\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0001D\u0000; 
+0

你的使用模式是不适合于API网关和Lambda的组合。 API网关仅限于代理或JSON/XML REST端点。通过它传递二进制有效载荷是一种破解。您应该直接将二进制数据存储到S3,然后通过通知或API网关触发Lambda函数。在这里搜索其他问题以获得更多关于它的信息,它已被多次解答。 – kixorz

+0

我无法存储在s3中,因为这应该是生成的图像。 – grosser

+0

我明白了。您需要将生成的二进制内容存储在S3中,并将301重定向到S3对象URL。您将无法直接通过API网关从Lambda返回二进制内容。 – kixorz

回答

2

OK,这是超级老线,但由于这个问题仍然没有得到解决,而GW是惨败证明了API的二进制数据支持,我认为有人可能找到我发现有用的解决方法:

我相信,二进制数据作为UTF-8字符串在API GW内部传递。如果您只需要返回一个跟踪像素(而不是生成的图像)​​,那么可以通过使用二进制数据中没有问题字节的图像来避免编码混乱的问题。

例如,最短的跟踪像素(26字节长的GIF)在中间具有十六进制表示0xFF的字节。这将打破API GW。但是,如果你在十六进制编辑器中编辑这张图片,并用0x00代替字节,你会得到一些仍然是有效图像的东西(甚至微软浏览器也不会抱怨),但仍可以通过API GW进行处理。

只是让你“身映射”模板是这样的:

$util.base64Decode("R0lGODlhAQABAAAAACwAAAAAAQABAAACADs=")