URL Encoding

什么是URL Encoding

​ URL encoding是Uniform Resource Identifier(URI)规范文档中对特殊字符编码制定的规则。本质是把一个字符转为
​ %加上UTF-8编码对应的16进制数字。故又称之为Percent-encoding。

RFC 3986把字符分为以下三类:

  1. 18个保留字符。: / ? # [ ] @ ! $ & ’ ( ) * + , ; =
  2. 66个非保留字符。a-z A-Z 0-9 - _ . ~
  3. 其它字符。 比如”好”等中文字符

为什么要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部分

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();
}

猜你喜欢

转载自blog.csdn.net/qq_44918331/article/details/114843684
URL
今日推荐