解决restTemplate中URL含有特殊字符的问题
背景
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; } TIP:通过UriComponentsBuilder创建URI对象
这样RestTemplate不会自动进行urlencode,这一步不能少
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(endUrl); URI uri = uriComponentsBuilder.build(true).toUri(); ResponseEntity<String> baseObject=restTemplate.getForEntity(uri,String.class);