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

Spring Boot服务端接收参数含%20未转空格,RestTemplate请求如何处理?

问题根因

你通过UriComponentsBuilder构造URL时已经完成了一次参数编码,生成的字符串URL中空格已被转为%20。而RestTemplate的getForEntity方法接收String类型URL参数时,默认会对URL执行二次编码,此时原有的%20会被编码为%2520。服务端收到请求后仅做一次URL解码,最终拿到的参数值就是Some%20Value,而非原始空格。

可用解决方案

方案1:直接传递Uri对象(推荐)

不要调用toUriString(),而是生成URI对象直接传给RestTemplate,避免二次编码:

URI uri = UriComponentsBuilder
   .fromHttpUrl(this.referenceDataBaseUrl)
   .path(this.referenceDataReadProperty)
   .queryParams(new LinkedMultiValueMap(multiValueParams))
   .build()
   .toUri();
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(uri, String.class);

RestTemplate收到URI类型参数时会默认跳过编码步骤,完全使用你构造好的URI发起请求。

方案2:关闭UriComponentsBuilder的自动编码

如果你需要保留字符串URL的构造方式,可关闭UriComponentsBuilder的编码逻辑,把编码工作完全交给RestTemplate处理:

String url = UriComponentsBuilder
   .fromHttpUrl(this.referenceDataBaseUrl)
   .path(this.referenceDataReadProperty)
   .queryParams(new LinkedMultiValueMap(multiValueParams))
   .build(false) // false表示不执行编码操作
   .toUriString();
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class);

方案3:使用占位符传参

如果参数数量少,可使用RestTemplate的占位符重载方法,由框架统一处理编码:

String url = "http://some-name:8080/readProperty?channel={channel}&service_name={serviceName}";
Map<String, Object> params = new HashMap<>();
params.put("channel", "E");
params.put("serviceName", "Some Value");
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class, params);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:21:01