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

Spring微服务间传递含%的请求参数解码异常求助

问题分析与解决方案

问题根源

  1. MessageFormat的误用:MessageFormat会将字符串中的%识别为格式控制符号,导致你编码后的参数被错误处理(比如丢失空格),最终传递到目标服务的参数出现无效的URL转义序列%3 (%后未跟随合法的两位十六进制字符),触发解码异常。
  2. 参数传递方式错误:你将查询参数直接拼接进URL路径并通过path()方法传递,而path()是用于处理URL路径段的,查询参数应通过专门的API设置,让框架自动处理编码逻辑,手动编码容易出现重复转义或编码不完整的问题。

解决方案

修改代码,使用JAX-RS的queryParam()方法设置查询参数,完全交由框架处理URL编码:

// 构造包含通配符的原始查询字符串
String searchQuery = "%" + searchAddress + "%";

// 通过queryParam传递参数,框架自动完成正确编码
Response response = rootWebTarget
    .path("/api/version/search") // 仅指定基础路径,不含查询参数
    .queryParam("address", searchQuery) // 传入原始字符串,框架负责编码特殊字符
    .request(MediaType.APPLICATION_JSON_TYPE)
    .header("Authorization", "AUTH_TOKEN")
    .get();

为什么这能解决问题?

  • 框架会自动对查询字符串中的特殊字符做标准URL编码:
    • 原始的%会被编码为%25
    • 空格会被编码为%20
  • 最终传递到目标服务的参数为%253%20ST%25,解码后会还原为你需要的%3 ST%,不会触发非法转义序列的异常。

额外注意事项

  • 不要手动调用URLEncoder.encode拼接参数,框架的queryParam已经封装了标准的URL编码逻辑,手动编码容易出现重复转义问题。
  • 禁止用MessageFormat处理URL参数拼接,它的设计目标是格式化文本消息,而非处理URL这类包含特殊符号的字符串。

内容的提问来源于stack exchange,提问作者user82504

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:49:15