问题:
在实际项目中,对传入的图片url进行下载,使用的是RestTemplate的exchange方法,具体如下:
使用以下RestTemplate的方法:
Sring url = "http://10.64.203.183:6120/pic?=d6ei2a4i9c84*33c-793=11i5m*ep5t9d5=*2pdi=*1s5i2=94b8i5d2e*14b863328-aa2e959-1b246b-43s=10d3z83";
ResponseEntity<byte[]> responseEntity = restTemplate
.exchange(url, HttpMethod.GET, null, byte[].class);
用这种方式调用请求,抓拍可看出url中的特殊字符被转义:
http://10.64.203.183:6120/pic?d6ei2a4i9c84*33c-793=11i5m*ep5t9d5%3D*2pdi%3D*1s5i2%3D94b8i5d2e*14b863328-aa2e959-1b246b-43s%3D10d3z83
由于第三方的图片服务器,没有对请求的url进行解码,因此不识别转义后的url导致下载失败。
解决方法:
如果不希望被转码,则可使用
public ResponseEntity exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, Class responseType)
该方法,直接传入URI对象。
该对象可如下进行组装:
Sring url = "http://10.64.203.183:6120/pic?=d6ei2a4i9c84*33c-793=11i5m*ep5t9d5=*2pdi=*1s5i2=94b8i5d2e*14b863328-aa2e959-1b246b-43s=10d3z83";
URI uri = new URI(url);
restTemplate.exchange(url, HttpMethod.GET, null, byte[].class);
这样,url就不会被encode成utf-8,不会将特殊字符转义,解决了下载失败的问题。
源码分析
以下是url被转码的源码分析。
对应的包为
Sring url = "http://10.64.203.183:6120/pic?=d6ei2a4i9c84*33c-793=11i5m*ep5t9d5=*2pdi=*1s5i2=94b8i5d2e*14b863328-aa2e959-1b246b-43s=10d3z83";
ResponseEntity<byte[]&