关于URL编解码的那些问题

工作当中经常遇到通过URL传递参数(常见的如GET请求)时出现参数乱码,或者URL中的参数传递到后端多了空格等字符,或者URL传递的参数被莫名其妙截断,或者http接口需要的数字签名参数一直验签失败等问题,经验丰富的程序员第一反应可能都是需要URL编解码,可为什么需要,什么时候需要,你是否一直都处于懵逼的状态?「码了个啥」继续发扬「死坑自个儿,分享大家」的程序员精神,与大家一起梳理一下关于URL编解码的问题。

为什么要URL编码

URL,即统一资源定位符,是可以从互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源的地址,它使用ASCⅡ字符集的一部分来表示互联网的地址,百度百科如是说。这里重点就是ASCⅡ字符集,意味着URL中如果有非ASCⅡ字符,如汉字等就必须要经过编码转化为ASCⅡ字符集字符。为什么说是一部分ASCⅡ字符集?因为URL需要过滤具有某些特殊含义的字符,网络标准RFC 1738做了硬性规定:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

“...只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。”

实际上,浏览器等很多http客户端,在我们输入URL访问某一资源时,会对URL自动进行编码,我们Java开发最常用的spring mvc也会对URL进行自动解码,进行资源映射和参数绑定,很多时候并不需要程序员关心。

我们实际开发中遇到的需要URL编解码的问题,往往是URL中的参数需要编解码,比如URL参数乱码,或者URL中的参数莫名其妙多了空格等其它字符,或者URL传递的参数被莫名其妙截断,又或者http接口需要的数字签名参数一直验签失败等问题。

如何编码

URL编码通常也被称为百分号编码(percent-encoding),使用%加上两位十六进制字符。URL编码要做的,就是将每一个非安全的ASCII字符都被替换为“%xx”格式,对于非ASCII字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过URL编码后得到"%E4%B8%AD%E6%96%87"。

URL编码表:

实际上,浏览器等很多HTTP客户端会对URL自动进行编码,比如我们要访问参数包含中文和URL参数分割符'&'的URL地址:

Microsoft Edge 浏览器看上去:

谷歌浏览器看上去:

可以看出参数aaa都被'&'符截断为两个参数,URL自动编解码并不能解决比如回掉地址拼接,分享链接拼接用户标识,或者URL拼接埋点参数等URL拼接所遇到的参数传递的问题,这个时候就需要我们手动对URL的参数部分进行编解码。

前端JavaScript做编解码

JavaScript URL编解码函数:

encodeURI()与decodeURI(),它适用于对整个URL进行编码,因此除了常见的符号以外,对其他一些在URL中有特殊含义的符号"; / ? : @ & = + $ , #"不进行编码。

JavaScript URL编解码函数:

encodeURIComponent()与 decodeURIComponent(),它与encodeURI()和decodeURI()的区别是,它适用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中会被编码。

下面的例子很容易看出两组函数的区别:

因此我们可以得出结论:

对个别URL组成部分,如参数编码用encodeURIComponent函数。

后端Java做编解码

java.net.URLEncoder#encode(java.lang.String, java.lang.String)与

java.net.URLDecoder#decode(java.lang.String, java.lang.String)

可以很容易看出,JavaURLEncoder#encode方法的功能与JavaScript 的encodeURIComponent函数相同。

以上,我们可以知道,像回掉地址拼接,分享链接拼接用户标识,或者URL拼接埋点参数等通过URL传递参数的开发需求,往往会遇到URL编解码参数传递的问题,比如URL参数乱码,或者URL中的参数莫名其妙多了空格等其它字符,或者URL传递的参数被截断,这个时候就需要我们手动对URL的参数部分进行编解码,再拼接到URL上,然后交由浏览器等HTTP客户端自动对URL做二次编解码,就能避免URL参数传递所遇到的问题。

关键词: URL解码
图片版权归原作者所有,如有侵权请联系我们,我们立刻删除。
新化月报网报料热线:886 2395@qq.com

相关文章

你可能会喜欢

最近更新

推荐阅读