【問題管理】-- restTemplate請求get方式中url包含+、空格、%、_等特殊符號


在實際項目中,我們經常會遇到get方式進行參數傳遞,而前端到后台,后台調用第三方接口API,這里往往涉及到很多編碼轉換的場景,前后端編碼方式不一致,tomcat服務端編碼設置遠程API接口編碼不一致,多種方式都有可能在url傳輸的過程中涉及到傳遞的參數(尤其是特殊字符)在url請求上轉換不一致導致請求異常或者請求到不想要的東西。這里就需要我們使用如下方式進行特殊字符的轉換:

1.轉義特殊字符

將特殊字符進行編碼轉義替換:

這里一般是采用后端接口Vo層set方法進行replaceAll替換特殊字符,轉義替換為不能被瀏覽器轉換的編碼格式:

+ (URL 中+號表示空格) ——>   %2B   
空格 (URL中的空格可以用+號或者編碼) ——>   %20 
/ (分隔目錄和子目錄) ——>  %2F     
? (分隔實際的URL和參數) ——>  %3F     
% (指定特殊字符) ——>  %25     
# (表示書簽) ——>  %23     
& (URL中指定的參數間的分隔符)——>  %26     
= (URL中指定參數的值)——>  %3D

例如,處理特殊字符_和%無法正確匹配的問題:

//替換特殊字符_和%為轉義字符,處理_和%匹配全部數據的情況
public void setPartnerName(String partnerName) {
      this.partnerName = partnerName.replaceAll("_", "\\\\_").replaceAll("%", "\\\\%");
}

注:

HTTP協議中 + 號轉譯為 %2B
HTTPS協議中 + 號轉譯為 %20

2.使用POST方式進行提交

使用post進行restTemplate方式進行url參數方式提交,避免url在編碼上的轉換

3.sql語句中使用escape

escape語句如下,表示/后面的%不再作為轉義字符,而是當做'%'這個字符來進行匹配:

select username from gg_user where username like '%xiao/%%' escape '/';

具體escape用法可以查看另一篇博文:

sql語句中escape的用法

4.使用Uri對特殊字符進行編碼

使用UrlEncoder對特殊字符編碼后,調用restTemplate.exchange中的new Uri()進行參數傳遞:

if (searchVO.getName().contains("+")) {
    String spacName = searchVO.getName();
    String encodeReqUrl = originalUrl.replace("{name}", spacName.replaceAll("\\+", "%2B"));
    URI spaceEncReqUrl;
    
    try {
        spaceEncReqUrl = new URI(encodeReqUrl);
        ResponseEntity<String> response = restTemplate.exchange(spaceEncReqUrl, String.class);
        return parseRespJsonToVo(response);
    } catch (URISyntaxException ex) {
        LOGGER.error("restTemplate request error: {}", ex.getMessage());
    }
}

 


免責聲明!

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



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