在實際項目中,我們經常會遇到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用法可以查看另一篇博文:
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()); } }