如何正确调用AWS Lambda + API Gateway的queryStringParameters?

JWB*_*JWB 7 amazon-web-services python-3.x aws-lambda aws-api-gateway

我正在遵循有关使用 Lambda 函数设置 AWS API Gateway 以创建 Restful API 的教程。我有以下代码:

import json

def lambda_handler(event, context):
    # 1. Parse query string parameters
    transactionId = event['queryStringParameters']['transactionid']
    transactionType = event['queryStringParameters']['type']
    transactionAmounts = event['queryStringParameters']['amount']

    # 2. Construct the body of the response object
    transactionResponse = {}
    # returning values originally passed in then add separate field at the bottom
    transactionResponse['transactionid'] = transactionId
    transactionResponse['type'] = transactionType
    transactionResponse['amount'] = transactionAmounts
    transactionResponse['message'] = 'hello from lambda land'

    # 3. Construct http response object
    responseObject = {}
    responseObject['StatusCode'] = 200
    responseObject['headers'] = {}
    responseObject['headers']['Content-Type'] = 'application/json'
    responseObject['body'] = json.dumps(transactionResponse)

    # 4. Return the response object
    return responseObject

Run Code Online (Sandbox Code Playgroud)

当我将 API 网关链接到此函数并尝试使用查询参数调用它时,出现错误:

{
"message":"Internal server error"
}
Run Code Online (Sandbox Code Playgroud)

当我测试 lambda 函数时,它返回错误:

{
  "errorMessage": "'transactionid'",
  "errorType": "KeyError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 5, in lambda_handler\n    transactionId = event['queryStringParameters']['transactionid']\n"
  ]
Run Code Online (Sandbox Code Playgroud)

有人知道这里发生了什么/如何让它工作吗?

jar*_*mod 11

我建议添加一些诊断,如下所示:

import json

def lambda_handler(event, context):
    print('event:', json.dumps(event))
    print('queryStringParameters:', json.dumps(event['queryStringParameters']))

    transactionId = event['queryStringParameters']['transactionid']
    transactionType = event['queryStringParameters']['type']
    transactionAmounts = event['queryStringParameters']['amount']
    // remainder of code ...
Run Code Online (Sandbox Code Playgroud)

这样你就可以看到event和中的内容event['queryStringParameters']确保它与您期望看到的内容相符。这些将记录在 CloudWatch Logs 中(如果您使用控制台测试事件,则可以在 AWS Lambda 控制台中看到它们)。

就您而言,事实证明您的测试事件包括transactionId您的代码预期看到的时间transactionid(不同的拼写)。因此出现了 KeyError 异常。