RestTemplate发送请求url中带百分号%被转义

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就会直接执行

猜你喜欢

转载自www.cnblogs.com/zhengy-001/p/11983630.html