【问题标题】:How to correctly call queryStringParameters for AWS Lambda + API Gateway?如何正确调用 AWS Lambda + API Gateway 的 queryStringParameters?
【发布时间】:2021-01-10 01:29:18
【问题描述】:

我正在学习使用 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

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

{
"message":"Internal server error"
}

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

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

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

【问题讨论】:

  • 您提交了什么 URL 路径/查询以及 event['queryStringParameters'] 包含什么?
  • 我提交了 my-api-gateway-url.com/test?transactionid=5&type=purchase&amount=50 并且根据我的理解 event['queryStringParameters'] 是一个字典,如果 API 网关传递一个查询字符串参数
  • 您在使用 Lambda 代理集成吗? event['queryStringParameters'] 实际上包含什么?
  • 是的,我该如何检查?它应该包含查询字符串参数,不是吗?
  • 文档解释了如何配置 Lambda 代理集成。检查一下,然后实际打印出 eventevent['queryStringParameters'] 的值(最好是经过美化的 JSON),这样您就可以看到实际呈现给 Lambda 函数的内容。

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


【解决方案1】:

我建议添加几个诊断程序,如下所示:

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 ...

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

在您的情况下,事实证明您的测试事件包含transactionId,而您的代码预计会看到transactionid(不同的拼写)。因此出现 KeyError 异常。

【讨论】:

    【解决方案2】:

    只需删除 ['queryStringParameters']。打印事件行显示事件 i 只是一个数组而不是键值对。我碰巧正在遵循相同的教程。我还在 api 网关部分,所以我会在我的完成后更新。

    当您从 lambda 函数测试时,事件中没有 queryStringParameters,但从 api 网关调用时它存在,您也可以从需要 queryStringParameters 的 api 网关进行测试以获取传递的值。

    【讨论】:

    • 所以你是说event['transactionid'] 应该可以工作?
    • 或在 lambdafunction { "queryStringParameters": { "transactionid": 123, "type": "type", "amount": 123 } } 上添加 queryStringParameters 到您的测试 json
    【解决方案3】:

    问题不在于您的代码。它是 Lambda 函数集成设置。请不要启用 Lambda 函数集成设置。您仍然可以在没有它的情况下附加 Lambda 函数。不选中此项。

    【讨论】:

      【解决方案4】:

      这是因为 responseObject['StatusCode'] = 200 中的拼写错误。

      'StatusCode' 应该是'statusCode'。

      我遇到了同样的问题,就是这样。

      【讨论】:

        猜你喜欢
        • 2017-12-07
        • 2017-11-04
        • 2017-01-07
        • 2020-10-01
        • 2018-08-28
        • 2017-09-19
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多