AWS API Gateway接收编码JSON查询参数返回400 Bad Request求助
解决API Gateway透传半编码JSON查询参数的400错误问题
问题本质
API Gateway默认会对查询参数做严格的URI编码校验,当参数值包含{、:这类未完全编码的特殊字符时,会判定请求格式非法并返回400 Bad Request。而你的遗留API允许半编码的JSON参数(仅引号编码,大括号、冒号等保留原样),因此需要调整API Gateway的配置或Lambda处理逻辑,适配这种参数格式。
解决方案
方案1:关闭API Gateway的查询参数URI编码强制校验
- 登录API Gateway控制台,定位到你的REST API。
- 找到对应的资源(如
/users),点击方法请求。 - 展开URL查询参数模块:
- 如果未定义
id参数,点击添加查询参数,输入id并保存。 - 找到已添加的
id参数,点击编辑按钮,将URI encode required设置为false。
- 如果未定义
- 重新部署你的API(必须完成部署才会生效)。
方案2:在Lambda代理集成中直接使用原始查询字符串
如果方案1不生效(部分区域或API版本可能存在限制),可以在Lambda代码中跳过API Gateway的参数解析,直接使用原始查询字符串透传:
- Lambda代理集成会将未解析的原始查询字符串通过
event.rawQueryString字段传递给函数,直接拼接该字段到遗留API的请求URL即可。
以下是Node.js示例代码:
const axios = require('axios'); exports.handler = async (event) => { // 直接使用原始查询字符串,避免API Gateway的解析校验 const legacyApiUrl = `https://your-legacy-api-domain.com/users?${event.rawQueryString}`; try { const response = await axios.get(legacyApiUrl); return { statusCode: response.status, headers: response.headers, body: JSON.stringify(response.data) }; } catch (err) { return { statusCode: err.response?.status || 500, body: JSON.stringify({ error: err.message }) }; } };
Python示例代码:
import requests import json def lambda_handler(event, context): legacy_api_url = f"https://your-legacy-api-domain.com/users?{event['rawQueryString']}" try: response = requests.get(legacy_api_url) return { 'statusCode': response.status_code, 'headers': dict(response.headers), 'body': json.dumps(response.json()) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({'error': str(e)}) }
验证
配置完成后,用Postman发送原半编码格式的请求(https://test.my.api.com/users?id={%22email%22:%22test.user@mail.com%22}),确认请求能正常透传至遗留API并返回正确结果。
内容的提问来源于stack exchange,提问作者kyra
相关产品推荐
相关产品推荐

