Amazon web services AWS API网关POST请求在将图像作为有效负载发送时不返回输出

Amazon web services AWS API网关POST请求在将图像作为有效负载发送时不返回输出,amazon-web-services,aws-lambda,aws-api-gateway,Amazon Web Services,Aws Lambda,Aws Api Gateway,我已经花了很多时间,但仍然没有运气 我的目标是向AWS Lambda函数发送一个图像,并在那里进行一些图像处理,然后返回修改后的图像。我使用的是API网关。因此,我面临的问题是: 将图像数据发送到Lambda服务器。 从Lambda返回图像。 我正在使用PostAPI。由于现在我们可以在API网关中使用二进制数据,我遵循了中的API网关设置部分 我的Lambda函数如下所示: def lambda_handler(event, context): # TODO implement

我已经花了很多时间,但仍然没有运气

我的目标是向AWS Lambda函数发送一个图像,并在那里进行一些图像处理,然后返回修改后的图像。我使用的是API网关。因此,我面临的问题是:

将图像数据发送到Lambda服务器。 从Lambda返回图像。 我正在使用PostAPI。由于现在我们可以在API网关中使用二进制数据,我遵循了中的API网关设置部分

我的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)
根据博客,在集成请求中,我添加了映射模板image/png和模板

{
    "base64Image" : "$input.body"
}
在API>设置的二进制媒体类型中,我添加了image/png

现在发生的事情是,我能够在我的事件[base64Image]对象中正确地接收image base64数据

但我得到的回应结果是不会出现的。正如您所看到的,我只是返回一个简单的字符串,但是我得到了“{message:internalserver error}”错误。我尝试直接发送base64数据来代替结果体中的任何字符串,但得到了相同的错误

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

我也遵循了这一点,因此在我的集成响应中,我选择了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文件夹中

更正:其内容类型而非内容/类型。错误仍然存在。

将Accept Header content type设置为application/json,因为要接收的数据是字符串

文件中清楚地写着:


所以,没什么。1.您将内容/类型作为标题,而不是内容类型。2.在POST lambda的主体中,您需要发回您想要响应的字符串化json,即您的image base64。此外,我还不明白为什么要使用映射模板并使用此负载进行响应。您的响应就像检查api网关中的lambda代理请求一样。如果不勾选此框,则需要一个带有请求模板的响应模板。如果不勾选“将lambda用作集成代理”框,则在api网关中使用响应模板(即application/json)将胜过lambda中的图像/png。@LostJon感谢您查看此框。对于第2点,你说的,对于键体,我只传递一个string对象。那么,这是错的吗?另外,我还没有检查Lambda Proxy。@LostJon我有一个请求模板,如问题Base64图像所示,但我没有响应模板。对于我的这个响应输出,我需要添加一个响应模板吗?嘿@arqam,我总是在使用lambda作为集成代理之间进行描述,如果您希望lambda处理所有映射,即处理输入负载/头/etc和响应负载/头/etc,那么请选中api网关中的该框;否则,为请求和响应创建映射模板。听起来你在使用两者的混合体。