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

新手上路,请多包涵

我正在学习有关使用 Lambda 函数设置 AWS API 网关以创建 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"
  ]

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

原文由 JWB 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 912
2 个回答

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

 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 异常。

原文由 jarmod 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

原文由 Gordon Christie 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进