resteTemplate中url如果带%,被被转义成%25,无法正确的访问资源
例如: https://xxx.xxx.xx?sig=Tr5VnQ1enApvTxZJxsr99Bb5m%2BhM1%2FpSxXUOrmAVjN8%3D
会被转为:https://xxx.xxx.xx?sig=Tr5VnQ1enApvTxZJxsr99Bb5m%252BhM1%252FpSxXUOrmAVjN8%253D
解决办法:
将String的url参数转为URI参数:
示例代码:
String url = "https://xxx.xxx.xx?sig=Tr5VnQ1enApvTxZJxsr99Bb5m%2BhM1%2FpSxXUOrmAVjN8%3D"; try { //将String的url转为URI对象 URI uri = new URI(url); HttpHeaders header = new HttpHeaders(); Object o = restTemplate.exchange( url, HttpMethod.GET, new HttpEntity<String>(header), String.class); } catch (URISyntaxException e) { e.printStackTrace(); }
通过
URI uri = new URI(url);
%的转换问题就解决了!
原因分析:
以restTemplate的exchange方法为例,其他的getForObject,getForEntity,postForObject等也是一样的,
如果参数是String类型的url,在excute发送请求之前,会先将String类型的url转为URI类型的url,就是在这个过程中出现的转换错误。
源码如下:
String类型的url需要先转为URI
URI类型的url就会直接执行