1.在正常情况我们使用时,代码如下,uri传入的是url字符串
ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class);
2. 源码:默认调用的是 UriComponentsBuilder.fromUriString(uriTemplate)方法,此方法对url解析使用的正则表达式和编码方式,会导致特殊字符的丢失;所以,为了使特殊字符能正常传到服务端,这里就需要使用 UriComponentsBuilder.fromHttpUrl(uriTemplate)方法,他会正则表达式会保留特殊字符并且它能对其进行编码处理;故需要使用fromHttpUrl方法
3.如下解决办法,以下为示例代码:
//fromUriString方法是工具自动构建出URL对象并进行编码,下面是自己手动构建对象并对url进行编码
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
//对访问地址进行处理
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(httpPath);
URI uri = builder.build().encode().toUri();
ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class);
如上步骤便能解决特殊字符问题
例如:http://123.123.123.123:8020/test/api/ck7_8/horizontalTemperature/getHorizontalTemp?startTime=1606005325000&heatNumber=7#&endTime=160626452500