You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编码强制校验

  1. 登录API Gateway控制台,定位到你的REST API。
  2. 找到对应的资源(如/users),点击方法请求。
  3. 展开URL查询参数模块:
    • 如果未定义id参数,点击添加查询参数,输入id并保存。
    • 找到已添加的id参数,点击编辑按钮,将URI encode required设置为false。
  4. 重新部署你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:23:12