解決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;
    }

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM