导航
导航
文章目录
  1. # 问题:
  2. # 原因:
  3. # 解决:

RestTemplate特殊字符问题

# 问题:

使用RestTemplate调用rabbitmq api的接口, 对于virtualhost 带有”/“的字符串,,get方式请求,对于含“/”的encode转义以后请求不成功。

# 原因:

在拼接url时候 “/” encode被转义成“%2F”,url地址中有特殊的转义字符,restTemplate会默认进行转义

如果拼接url的时候不对“/”进行转义, restTemplate对于url中有“/”也会无视通过

原始url:http://xxxxxx/api/queues/%2F/queue-27

在RestTemplate转义的url:http://xxxxxx/api/queues/%252F/queue-27

url中%是特殊的字符,并转义为: %25. 但是被转义之后的URL不是正确的URL地址,所以不能请求成功。

debug源码后发现 真正进行UriString构建的操作在org.springframework.web.util.HierarchicalUriComponents类中 encodeBytes方法会对%的进行转义处理

# 解决:

第一种方式 使用httpClient

第二种方式,改写RestTemplate 通过UriComponentBuilder


UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
URI uri = builder.build().encode().toUri();

HttpEntity<String> response = restTemplate.exchange(uri,HttpMethod.GET,entity,String.class);

ps:RestTemplate 进行数据请求如果url中带有特殊字符时会导致请求出错,遇到‘#’的问题,接收到的传参会省略‘#’后面的内容;还有其他一些特殊符号如 +、=、&、%等