【发布时间】:2018-12-11 00:27:07
【问题描述】:
我花了很多时间,但仍然没有运气。
我的目标是将图像发送到 AWS Lambda 函数并在那里进行一些图像处理并将修改后的图像返回。我使用的是API Gateway。所以,对我来说问题操作是:
- 将图像数据发送到 Lambda 服务器。
- 从 Lambda 返回图像。
我正在使用 POST API。由于现在我们可以在 API Gateway 中处理二进制数据,所以我遵循了 this official blog 中的 API Gateway 设置部分。
我的 Lambda 函数是这样的:
def lambda_handler(event, context):
# TODO implement
image = event['base64Image']
return {
"isBase64Encoded": True,
"statusCode": 200,
"headers":{
"content/type": "image/png",
},
"body": "any string"
}
我对 API python 代码的调用是这样的:
headers = {
'Accept': 'image/png',
'Content-Type': 'image/png',
}
data = open('random.jpg', 'rb').read()
response = requests.post(' https://xxxxxxx.execute-api.us-east-1.amazonaws.com/prod', headers=headers, data=data)
print(response.content)
根据博客,在Integration Request 我添加了映射模板image/png 以及模板
{
"base64Image" : "$input.body"
}
并且在Binary Media Type 的API > 设置中,我添加了image/png。
现在发生的事情是,我能够在我的event[base64Image] 对象中正确接收图像 base64 数据。
但是我得到的响应结果并没有到来。正如你所看到的,我只是返回一个简单的字符串,但我得到'{"message": "Internal server error"}' 错误。代替result 正文中的"any string",我也尝试直接发送base64 数据,但得到了同样的错误。
所以,问题归结为当我们将图像数据作为有效负载发送时,如何在 POST 请求中接收结果。
我也关注了this answer,因此在我的Integration Response 中我选择了Convert to Binary (if needed) 选项。但这也无济于事。
如果我没记错,那么问题与 application/json 和 image/png 有关,但我尝试了所有的排列组合,但似乎没有任何效果。
我附上 API 网关设置的屏幕截图:
整合响应
设置
它自己的控制台中的 Lambda 函数正确地给出了输出,所以我现在的问题归结为在此设置中使用 POST API 从 lambda 函数接收任何结果。
编辑:当我使用 GET 请求仅发送图像-> base64 输出时,我无需进行博客中提到的更改即可。那么 Lambda 函数是:
def lambda_handler(event, context):
# TODO implement
return {
"isBase64Encoded": True,
"statusCode": 200,
"headers":{
"content/type": "image/png",
},
"body": base64.b64encode(open('random.jpg','rb').read()).decode('utf-8')
}
这里的 random.jpg 是仅存在于 Lambda zip 文件夹中的图像。
更正:它是content-type 而不是content/type。 (错误仍然存在)。
【问题讨论】:
-
所以,几件事。 1.你有
content/type作为标题而不是content-type。 2. 在POSTlambda 的正文中,您需要发回您想要响应的字符串化json(即您的图像base64)。另外,我很困惑为什么您使用映射模板并使用此有效负载进行响应。您正在响应,就像您在 api 网关中检查“lambda 代理请求”一样。如果您不选中该框,则需要有一个带有请求模板的响应模板。 -
如果您不选中“使用 lambda 作为集成代理”框,则在 api-gateway 中具有
application/json的响应模板将胜过 lambda 中的image/png。 -
@LostJon 感谢您浏览此内容。所以,对于第 2 点,你所说的,对于
key正文,我只传递了一个字符串对象。那么,那里错了吗?另外,我还没有检查过 Lambda 代理。 -
@LostJon 我确实有问题(base64Image)中所示的请求模板,但我没有响应模板。对于我的这个响应输出,是否需要添加响应模板?
-
嘿@arqam,我总是在使用 lambda 作为集成代理之间描述的方式是,如果您希望 lambda 处理所有映射(意味着处理输入有效负载/标头/等和响应有效负载/标头/等) 然后在 api gateway 中选中该框;否则,为请求和响应制作一个映射模板。听起来你正在使用两者的混合体。
标签: amazon-web-services aws-lambda aws-api-gateway