有的時候,我們并不知道接口傳過來的字符串數(shù)據(jù)是否是經(jīng)過了URLENCODER處理后的數(shù)據(jù)淮野;或者接口上線后捧书,突然有部分調用者對參數(shù)URLENCODER處理骤星,而有部分調用者沒有;那么這種情況下舆吮,我們只有在接口層面队贱,來適配參數(shù)了色冀;下面一個類用來對參數(shù)進行url coder處理柱嫌;可以直接用。其中hasEnCode方法就是用來判斷函數(shù)是否進行了url encoder處理与学;
import org.apache.commons.lang3.StringUtils;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.BitSet;
public class UrlCoderUtil {
static BitSet dontNeedEncoding;
private UrlCoderUtil() {
}
static {
dontNeedEncoding = new BitSet(128);
int i;
for (i = 'a'; i <= 'z'; i++) {
dontNeedEncoding.set(i);
}
for (i = 'A'; i <= 'Z'; i++) {
dontNeedEncoding.set(i);
}
for (i = '0'; i <= '9'; i++) {
dontNeedEncoding.set(i);
}
dontNeedEncoding.set('+');
dontNeedEncoding.set('-');
dontNeedEncoding.set('_');
dontNeedEncoding.set('.');
dontNeedEncoding.set('*');
dontNeedEncoding.set('%');
}
/**
* 字符串是否經(jīng)過了url encode
*
* @param text 字符串
* @return true表示是
*/
public static boolean hasEnCode(String text) {
if (StringUtils.isBlank(text)) {
return false;
}
for (int i = 0; i < text.length(); i++) {
int c = text.charAt(i);
if (!dontNeedEncoding.get(c)) {
return false;
}
if (c == '%' && (i + 2) < text.length()) {
// 判斷是否符合urlEncode規(guī)范
char c1 = text.charAt(++i);
char c2 = text.charAt(++i);
if (!isDigit16Char(c1) || !isDigit16Char(c2)) {
return false;
}
}
}
return true;
}
/**
* 對字符串s用charset方式編碼
*
* @param s 需要編碼的字符串
* @return 編碼后的字符串
*/
public static String encode(String s) {
return encode(s, StandardCharsets.UTF_8);
}
/**
* 對字符串s用charset方式編碼
*
* @param s 需要編碼的字符串
* @param charset 編碼類型
* @return 編碼后的字符串
*/
public static String encode(String s, Charset charset) {
if (StringUtils.isBlank(s)) {
return null;
}
try {
return URLEncoder.encode(s, charset.name());
} catch (Exception e) {
log.error("exception:", e);
}
return null;
}
/**
* 對已編碼的字符串解碼
*
* @param s 字符串
* @return 解碼后字符串
*/
public static String decode(String s) {
return decode(s, StandardCharsets.UTF_8);
}
/**
* 對已編碼的字符串解碼
*
* @param s 字符串
* @param charset 解碼方式
* @return 解碼后字符串
*/
public static String decode(String s, Charset charset) {
try {
return URLDecoder.decode(s, charset.name());
} catch (Exception e) {
log.error("exception:", e);
}
return null;
}
/**
* 判斷c是否是16進制的字符
*
* @param c 字符
* @return true表示是
*/
private static boolean isDigit16Char(char c) {
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F');
}
}