Java教程

解决restTemplate中URL含有特殊字符的问题

本文主要是介绍解决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);

 

这篇关于解决restTemplate中URL含有特殊字符的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!