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

Java Spring WebClient自动转义%字符:URI中#编码异常问题

解决WebClient处理含#字符URI的转义问题

问题原因

直接拼接字符串构建URI时,WebClient会对整个字符串进行二次编码,导致手动转义的%被再次转义成%25;而直接保留#的话,因为#在URI中默认是片段标识符的开头,WebClient不会自动将其转义为路径/查询参数的合法字符。

正确做法

不要手动转义,使用UriComponentsBuilder构建URI,或者利用WebClient的参数化uri方法,让框架正确处理特殊字符的转义:

方法一:使用UriComponentsBuilder构建完整URI

import org.springframework.web.util.UriComponentsBuilder;

// ...

String tag = "#8QQRVVL0";
String playersEndpoint = "players/";

// 构建URI,自动处理特殊字符转义
String uri = UriComponentsBuilder.fromPath(playersEndpoint + tag).build().encode().toUriString();

JSONObject json = webClient.get()
        .uri(uri)
        .retrieve()
        .bodyToMono(JSONObject.class)
        .block();

方法二:使用WebClient的参数化uri方法

如果tag是路径参数的一部分,可以用占位符的方式传入,框架会自动转义:

String tag = "#8QQRVVL0";

JSONObject json = webClient.get()
        .uri("players/{tag}", tag) // 这里的{tag}会自动转义特殊字符
        .retrieve()
        .bodyToMono(JSONObject.class)
        .block();

为什么之前的方法失效

  • 手动替换#为%23后,WebClient会把整个拼接后的字符串当作未编码的内容,将%再次转义为%25,最终得到%2523。
  • 直接保留#时,WebClient会将其识别为URI片段的起始符,不会将其作为路径的一部分进行转义,导致后端无法正确识别这个标识符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:57:32