API Gateway GET请求调用Lambda时event和queryStringParameters为空问题
问题描述
我通过API Gateway的GET请求调用Lambda函数,已填写查询字符串参数,但测试方法时发现event对象和queryStringParameters均为空对象。
相关实现代码:
import boto3 dynamodb = boto3.resource('dynamodb') def lambda_handler(event, context): print('event why no wrk:', json.dumps(event)) print('queryStringParameters:', json.dumps(event['queryStringParameters']))
参数配置截图:
查看Cloudwatch日志后,打印语句的输出如下:
2021-09-07T22:19:16.949-07:00 event why no wrk: {} 2021-09-07T22:19:16.949-07:00 [ERROR] KeyError: 'queryStringParameters' Traceback (most recent call last): File "/var/task/
问题原因
- 未使用Lambda代理集成:如果API Gateway到Lambda的集成是非代理集成模式,默认不会自动把请求的查询参数、路径参数等信息塞入event对象,需要手动配置映射模板才会传递参数,未配置的情况下event就会是空对象。
- 控制台测试未填写测试参数:你在「方法请求」中配置的查询字符串参数只是参数校验规则,不会自动生效到控制台测试场景。控制台测试时需要单独在测试页面的「查询字符串」栏填写实际键值对,才会把参数传给Lambda。
- 代码存在基础问题:提供的代码中没有导入
json模块,就算参数正常传递也会抛出导入错误,且直接通过键名访问queryStringParameters未做非空判断,没有查询参数时会触发KeyError。
解决方案
方案一(推荐):开启Lambda代理集成
Lambda代理集成是官方推荐的集成方式,无需手动配置参数映射即可自动传递所有请求信息,操作步骤如下:
- 进入API Gateway对应API方法的「集成请求」页面
- 确认集成类型为「Lambda函数」,勾选「使用Lambda代理集成」选项,保存后重新部署API
- 代理集成模式下
queryStringParameters字段会自动存在,无查询参数时为None而非抛出异常
方案二(适用于非代理集成场景):手动配置映射模板
如果需要使用非代理集成,可手动配置参数映射规则:
- 进入「集成请求」页面,找到「映射模板」配置项
- 添加内容类型为
application/json的映射模板,填入以下内容后保存:
{ "queryStringParameters": { #foreach($param in $input.params().querystring.keySet()) "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end #end } }
- 重新部署API后即可正常传递查询参数
通用操作
- 控制台测试时,在测试页面的「查询字符串」输入框按
参数名1=参数值1&参数名2=参数值2的格式填写测试参数后再发起测试 - 修正代码的导入和空判断问题,参考代码如下:
import boto3 import json # 补全缺失的json模块导入 dynamodb = boto3.resource('dynamodb') def lambda_handler(event, context): print('event why no wrk:', json.dumps(event)) # 用get方法取值,无对应字段时返回空字典,避免KeyError query_params = event.get('queryStringParameters', {}) print('queryStringParameters:', json.dumps(query_params))
内容的提问来源于stack exchange,提问作者Eric Gumba
相关产品推荐
相关产品推荐

