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就會直接執行