restTemplate请求和在页面上直接请求结果不一样,发现是restTemplate对url特殊字符处理的不好。
以下是解决办法
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; }
这样RestTemplate不会自动进行urlencode,这一步不能少
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(endUrl); URI uri = uriComponentsBuilder.build(true).toUri(); ResponseEntity<String> baseObject=restTemplate.getForEntity(uri,String.class);