URL编码的原因及场景

URL编码的原因及场景

一般开发中,如果一个东西需要被编码,其原因有多种:由于私密信息传输需要被编码、由于传输时内容过大需要编码压缩等等;

而URL编码则是为了解决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。”

1.url路径中存在中文参数时

如下面的url路径

www.baidu.com?id=123&name=中文

对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如”中文”使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到”%E4%B8%AD%E6%96%87”。或是在程序中使用专门的UrlEncode编码;

正确的带中文内容路径的访问方式如下:

www.baidu.com?id=123&name=%E4%B8%AD%E6%96%87

2.url路径中带有特殊符号

某些特殊符号在url中会产生歧义

序号特殊字符含义十六进制值
1+URL 中+号表示空格%2B
2空格URL中的空格可以用+号或者编码%20
3/分隔目录和子目录%2F
4?分隔实际的 URL 和参数%3F
5%指定特殊字符%25
6#表示书签%23
7&URL 中指定的参数间的分隔符%26
8=URL 中指定参数的值%3D

如下情况:

我们都知道Http协议中参数的传输是”key=value”这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如”?name1=value1&name2=value2”,这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。

比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。

总结:

上述的情况就是url中特殊字符锁产生的歧义;针对上述情况,我们通常在发送http请求之前都会进行url编码,将特殊字符转换成为十六进制带百分号的形式,或者对中文字符进行url编码再进行传输。

补充:有时候在调用外部接口的时候,要注意需要传输的内容是否需要url编码,否则会出现错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值