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

Spring Web REST调用特殊字符编码异常,如何避免手动编解码?

根本原因

特殊字符转空格问题本质是URL编码规则不匹配:

  • UriComponentsBuilder 默认遵循RFC 3986编码规范,该规范中+、|不属于必须编码的字符,会直接拼接在URL中
  • 服务端解析GET参数时默认遵循application/x-www-form-urlencoded规范,会将URL中的+解析为空格,未编码的|也会被特殊处理

无需手动编解码的解决方案

方案1:调整UriComponentsBuilder用法,显式编码生成URI对象

不要调用builder.build().toString(),直接生成编码后的URI对象传给RestTemplate即可避免编码失效:

final String url = baseUrl() + "/getOrders";
final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
builder.queryParam("username", username);
// 直接生成编码后的URI对象,无需转字符串
URI requestUri = builder.build().encode(StandardCharsets.UTF_8).toUri();

final ResponseEntity<TResponse> restResp = restTemplate.exchange(requestUri, HttpMethod.GET, entity, OrdersResult.class);

该方式下Spring会自动按照URL参数规范完成编码,服务端可直接拿到原始的username值,不需要手动解码。

方案2:使用RestTemplate占位符传参,由框架自动编码

直接将参数写入URL占位符中,RestTemplate会自动完成参数编码:

String url = baseUrl() + "/getOrders?username={username}";
Map<String, Object> params = Collections.singletonMap("username", username);
final ResponseEntity<TResponse> restResp = restTemplate.exchange(url, HttpMethod.GET, entity, OrdersResult.class, params);

方案3:特殊字符较多时优先用POST请求传输

如果username会频繁出现各类特殊字符,直接改为POST请求将参数放在请求体中传输,完全规避URL编码问题:
客户端调整为POST传参,服务端接口对应调整为RequestMethod.POST,参数用@RequestBody接收即可。

内容的提问来源于stack exchange,提问作者johnny-b-goode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:45:03