将图像作为有效载荷发送时,AWS API Gateway POST请求未返回输出

时间:2018-12-10 13:10:00

标签: amazon-web-services aws-lambda aws-api-gateway

我花了很多时间,但是仍然没有运气。

我的目标是将图像发送到AWS Lambda函数并在那里进行一些图像处理,然后将修改后的图像返回。我正在使用API Gateway。因此,对我来说,问题操作是:

  1. 将图像数据发送到Lambda服务器。
  2. 从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"}'错误。我尝试在"any string"正文中代替result,也尝试直接发送base64数据,但收到相同的错误。

因此,问题归结为当我们将图像数据作为有效载荷发送时如何在POST请求中接收结果。

我也遵循了this answer,因此在我的Integration Response中,我选择了Convert to Binary (if needed)选项。但这也无济于事。

如果我没记错,那么问题可能与application/jsonimage/png有关,但是我在所有地方都尝试了所有置换组合,但似乎无济于事。

我将附加API Gateway设置的屏幕截图:

集成请求 enter image description here

集成响应

enter image description here

设置

enter image description here

其控制台中的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 个答案:

答案 0 :(得分:1)

Accept标头内容类型设置为application/json,因为要接收的数据是字符串。

在文档中清楚地写着:

enter image description here