解决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);