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

12-26 23:38