问题
最近在对接外部的一个系统的https接口,代码中通过restTemplate去发送的post请求屡次失败,最终问题定位为发送的url路径中的特殊符号被进行了二次转义
1,请求路径
http://172.16.20.59:1160/imgu?Action=Upload&expired=j7M9%2FOr6k0os5AGPIFzhRKkd0xOeKa6w-20211229093557
通过wireShark进行https的请求抓包得到下边的结果
2,通过抓包实际获取到的https 的路径为
http://172.16.20.59:1160/imgu?Action=Upload&expired=j7M9%252FOr6k0os5AGPIFzhRKkd0xOeKa6w-20211229093557
什么鬼!!! expired参数中多了个%25,,进行了二次转义
3,解决方案
通过讲String类型的url转为URL来避免restTemplate的二次特殊符号转义
// 通过UriComponentsBuilder创建URI对象,这样RestTemplate不会自动进行urlencode
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpsUrl + "&ttl=9999");
URI uri = uriComponentsBuilder.build(true).toUri();