Spring Cloud Gateway透传查询参数返回400 Bad Request如何解决
问题原因
返回400 Bad Request和路由匹配、参数转发逻辑无关,是Spring Cloud Gateway内嵌的Netty服务默认开启了URL合法性校验。你直接拼在查询参数里的JSON内容包含{}、"这类RFC 3986规范规定的必须URL编码的保留字符,Netty的请求解码器识别到非法未编码字符时,会直接在请求接入层返回400,请求根本不会进入后续的路由转发流程。
你的现有路由配置本身是符合需求的:Path断言仅校验请求路径,默认不会对原始查询参数做任何修改,只要请求能通过接入层校验,查询参数会自动原样透传到下游地址。
解决方案
根据你的业务场景二选一即可:
方案1:放开Netty的URL校验(适配现有未编码参数的调用逻辑)
如果调用侧暂时无法调整参数编码逻辑,直接在application.yml中添加以下配置,关闭Netty入站、出站的URL合法性校验即可,配置后原始查询参数会完整透传:
server: netty: # 关闭入站请求的URL、请求头校验 validate-headers: false spring: cloud: gateway: httpclient: # 关闭转发到下游时的URL校验 disable-validation: true
添加配置后重启网关,你示例中的带参请求即可正常转发到目标下游地址。
方案2:规范调用侧参数编码(更符合HTTP规范的长期方案)
按照HTTP URL编码规范,要求调用方将查询参数中的JSON内容做URL编码后再发起请求,例如你示例中的参数编码后格式为:config=%7B%22HEIGHT%22%3A22%2C%20%22WIDTH%22%3A%2030%7D
这种符合规范的请求不需要修改任何网关默认配置即可正常转发,下游Web容器会自动将编码后的参数解码为原始JSON格式,不会出现参数解析异常。
内容的提问来源于stack exchange,提问作者wilfredo ronsini
相关产品推荐
相关产品推荐

