背景
restTemplate請求和在頁面上直接請求結果不一樣,發現是restTemplate對url 參數中特殊字符處理的不好。
以下是解決辦法
encode URI中的參數
1.利用正則提取需要encode的uri部分
public static String getUTF8URLString2(String src) { // String str = "xxxx?a=1&b=2&c=3"; src+="&";//先加后刪 String reg = "=(.*?)\\&"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(src); String temp = null; StringBuffer sb = new StringBuffer(); while(m.find()){ temp = "="+m.group(1)+"&"; temp = temp.replace(m.group(1), getUTF8URLString(m.group(1))); m.appendReplacement(sb, temp); } m.appendTail(sb); String end =sb.substring(0,sb.length()-1); return end; }
2.調用encode方法
// 特殊字符 public static String getUTF8URLString(String src) { if (!StringUtils.hasText(src)){ return src; } if (src.contains("&")){ return src;//理論上不會有這種情況 } String dest = ""; try { dest = URLEncoder.encode(src, "utf-8").replaceAll("\\+", "%20"); } catch (UnsupportedEncodingException e) { log.error("編碼text錯誤",e); dest=src; }// 編碼 return dest; }
3.通過UriComponentsBuilder創建URI對象
這樣RestTemplate不會自動進行urlencode,這一步不能少
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(endUrl); URI uri = uriComponentsBuilder.build(true).toUri(); ResponseEntity<String> baseObject=restTemplate.getForEntity(uri,String.class);
最佳答案 直接處理URL
嘗試借助URI類拆分為URL:String sUrl = "http://bla.com:8080/test and test/bla.php?query=bla and bla";
URL url = new URL(sUrl);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String canonical = uri.toString();
System.out.println(canonical);
原文鏈接:https://blog.csdn.net/weixin_29435115/article/details/114562225