如何将包含大括号的QueryStringParams传入API Gateway Proxy/Lambda
解决API Gateway代理集成传递含大括号查询参数的问题
核心原因
API Gateway代理集成默认会自动对URL编码的查询参数进行解码,但大括号{}属于URL保留字符,若客户端未正确编码或网关内部解析逻辑误将其识别为模板占位符,会导致queryStringParameters中的参数值被错误转换。
可行解决方案
1. 直接使用Lambda事件中的原始查询字符串
API Gateway的代理事件包含未经过解析的rawQueryString字段,它完整保留了请求URL中的查询参数原始内容。你可以在Lambda中手动解析这个字段,绕过被错误处理的queryStringParameters。
示例Python代码:
import urllib.parse def lambda_handler(event, context): # 获取原始查询字符串 raw_query = event.get("rawQueryString", "") # 解析为键值对字典(注意parse_qs返回值为列表,需取第一个元素) parsed_params = urllib.parse.parse_qs(raw_query) param1 = parsed_params.get("param1", [""])[0] # 执行重定向逻辑,注意重定向时需对参数重新编码 return { "statusCode": 302, "headers": { "Location": f"https://your-target-domain.com?param1={urllib.parse.quote(param1)}" } }
2. 关闭API Gateway的自动URL解码功能
通过修改API Gateway集成配置,禁用查询参数的自动解码,让网关直接保留原始参数值:
- 登录API Gateway控制台,定位到目标API和资源
- 进入集成请求设置,展开查询字符串参数板块
- 将
Decode URL encoded characters选项设置为False - 重新部署API,此时
queryStringParameters中的参数值会保持原始的{param}格式
3. 验证原始请求的完整性
在Lambda中打印完整的event对象,确认rawQueryString是否准确传递了param1={param}。如果原始字符串已被篡改,需检查客户端请求逻辑,确保没有将大括号误识别为模板变量进行替换(比如某些HTTP客户端库的模板渲染功能)。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

