【问题标题】:Format body mapping templates in API Gateway在 API Gateway 中格式化身体映射模板
【发布时间】:2020-08-18 15:08:19
【问题描述】:

需要你的帮助!我有以下 Lambda 函数,它将从 API Gateway 获取输入(使用 RestAPI Post 方法)并将与 Payload 相同的内容传递给第二个 Lambda 函数。

    def lambda_handler(event, context):
    
        customerName = event['Name']
        customerEmail = event['EmailAddress']
        
        input = {"Name": customerName, "EmailAddress": customerEmail}
        
        response = lambda_client.invoke(
        FunctionName='arn_of_the_lambda_to_be_invoked',
        InvocationType='Event',
        Payload=json.dumps(input))

以下是我对 API 网关的 JSON 格式输入 -

    {
        "Name": "TestUser",
        "EmailAddress": "test@abc.com"
    }

已尝试 Lambda 代理集成和通用正文映射模板(来自 here)。在这两种情况下,API Gateway 都会返回以下错误 -

响应正文:

{
  "errorMessage": "'Name'",
  "errorType": "KeyError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 7, in lambda_handler\n    customerName = event['Name']\n"
  ]
}

当我从 Lambda 控制台直接调用 Lambda 时,使用相同的 JSON 输入,它可以工作。我知道 API Gateway 和 JSON 主体一起推动了许多其他事情。但是,我无法弄清楚。

我如何让它工作?

【问题讨论】:

  • 不要发布文字图片
  • 事件映射似乎没有名为“名称”的键。您能print(event) 并检查这些值是否存在吗?

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


【解决方案1】:

在 lambda 代理集成中,事件将采用以下格式。

{
    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": {String containing incoming request headers}
    "multiValueHeaders": {List of strings containing incoming request headers}
    "queryStringParameters": {query string parameters }
    "multiValueQueryStringParameters": {List of query string parameters}
    "pathParameters":  {path parameters}
    "stageVariables": {Applicable stage variables}
    "requestContext": {Request context, including authorizer-returned key-value pairs}
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"
}

您发布的值将作为 json 字符串在 body 中。你需要解析json。

import json

def lambda_handler(event, context):

    fullBody = json.loads(event['body'])
    print('fullBody: ', fullBody)
    body = fullBody['body']
    customerName = body['Name']
    customerEmail = body['EmailAddress']
    
    input = {"Name": customerName, "EmailAddress": customerEmail}
    
    response = lambda_client.invoke(
    FunctionName='arn_of_the_lambda_to_be_invoked',
    InvocationType='Event',
    Payload=json.dumps(input))

Input format of a Lambda function for proxy integration

请记住,对于 Lambda 代理集成,lambda 应返回以下格式的输出。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}

【讨论】:

  • 谢谢@ArunK。我已经如前所述修改了 Lambda,现在我传递如下输入 - { "body": {"Name": "TestUser", "EmailAddress": "test@abc.com"} } API Gateway 返回“内部服务器错误”并显示以下堆栈 - Endpoint response body before transformations: {"errorMessage": "'dict' object has no attribute 'body'", "errorType": "AttributeError", "stackTrace": [" File \"/var/task/lambda_function.py\", line 7, in lambda_handler\n body = json.loads(event.body)\n"]} Lambda execution failed with status 200: 'dict' object has no attribute 'body'
  • 你能打印一下活动吗
  • 抱歉,如何打印活动?当我使用 Lambda 代理集成时,输出必须采用某种格式,对吗?目前,下面是我在 Lambda 函数中的响应句柄 - response = { "statusCode": 200, "body": "Lambda is in progress" }
  • 我什至可以使用身体映射模板而不使用 Lambda 代理集成。在这种情况下,我在 Lambda 函数中的输入处理程序是什么?
  • 在 customerName 前添加 print(event) 并检查 cloudwatch 中的 lambda 日志
猜你喜欢
  • 1970-01-01
  • 2018-12-04
  • 2020-09-28
  • 1970-01-01
  • 2017-11-30
  • 2017-12-29
  • 1970-01-01
  • 2018-02-03
  • 2018-01-20
相关资源
最近更新 更多