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
相关产品推荐
相关产品推荐

