什么是URL Encoding
URL encoding是Uniform Resource Identifier(URI)规范文档中对特殊字符编码制定的规则。本质是把一个字符转为
%加上UTF-8编码对应的16进制数字。故又称之为Percent-encoding。
RFC 3986把字符分为以下三类:
- 18个保留字符。: / ? # [ ] @ ! $ & ’ ( ) * + , ; =
- 66个非保留字符。a-z A-Z 0-9 - _ . ~
- 其它字符。 比如”好”等中文字符
为什么要URL Encoding
URL(本质是URI,URL是URL的一个子集)中有几个字符有特殊意义。比如/ : ? =等。
如果想在URL里面加这些特殊字符,必须要编码一下,否则URL的真实意义与想要的效果可能会不一样。
怎么做URL Encoding
URL encoding分为两个步骤:
1.获取字符对应的16进制数字。比如”:” UTF-8对应的10进制是58,16进制是3A,所以这一步”:”得到”3A”;
2.在Step1的结果前面加”%”,这一步得到”%3A”。
URL Encoding的原则
谁生产Url,谁负责encode规则。原则上只encode查询参数的value部分,查询参数的key以及path避免特殊字符。
encode仅一次,decode仅一次。
保留字符必须encode
非保留字符不能encode
其它字符强烈建议encode
URL Encoding例子
拼装http查询参数,会urlEncode。注意只encode查询参数的value部分
扫描二维码关注公众号,回复:
12902988 查看本文章

public static String genParamsStr(Map<String, String> params) {
if (params.isEmpty()) {
return "";
}
StringBuilder builder = new StringBuilder();
builder.append("?");
Set<String> keys = params.keySet();
Iterator<String> iterKey = keys.iterator();
String firstKey = iterKey.next();
builder.append(firstKey + "=" + params.get(firstKey));
while (iterKey.hasNext()) {
String key = iterKey.next();
String value = params.get(key);
String valueEncoded = "";
try{
valueEncoded = URLEncoder.encode(value, "UTF-8");
}catch(Exception e){
log.warn("error when url encode order url");
}
builder.append("&" + key + "=" + valueEncoded);
}
return builder.toString();
}