我花了很多时间,但是仍然没有运气。
我的目标是将图像发送到AWS Lambda函数并在那里进行一些图像处理,然后将修改后的图像返回。我正在使用API Gateway
。因此,对我来说,问题操作是:
我正在使用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"}'
错误。我尝试在"any string"
正文中代替result
,也尝试直接发送base64数据,但收到相同的错误。
因此,问题归结为当我们将图像数据作为有效载荷发送时如何在POST请求中接收结果。
我也遵循了this answer,因此在我的Integration Response
中,我选择了Convert to Binary (if needed)
选项。但这也无济于事。
如果我没记错,那么问题可能与application/json
和image/png
有关,但是我在所有地方都尝试了所有置换组合,但似乎无济于事。
我将附加API Gateway设置的屏幕截图:
集成响应
设置
其控制台中的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
。 (错误仍然存在)。