网络篇:
一、构建请求 (对URL进行解析)
为什么要解析?
浏览器会解析 URL 得到里面的参数,将域名和需要请求的资源分离开来,从而了解需要请求的是哪个服务器,请求的是服务器上什么资源等等。
怎么解析?
在浏览器地址栏中输入信息,然后回车,浏览器会对URL进行判断,判断URL是否合法?主要是看这个链接有没有缺少 “ // ”,http或者http后面又没跟 冒号等。
合法就会继续检查他的完整性,如果不完整,浏览器可能会对域进行猜测,对输入的内容添加协议、域名、端口号、路径、哈希等补全 URL。 如果不合法浏览器将输入的内容作为搜索条件,使用用户设置的默认搜索引擎进行查询并返回结果。
因为网络标准规定了URL只能是字母和数字,还有一些其它特殊符号,比如-_.!等,不包括百分号和双引号,这意味着如果URL存在汉字,就必须编码后使用,有些情况URL不转义会出现歧义。
为什么不转译会出现歧义?
Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。
比如“name1=value1&name2=value2”,会用ASCII码进行编码编码,得到一串字母和数字组成的串
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
服务端在接收到该数据后就可以遍历该字节流,首先一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再想后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。
但是如果出现了一种情况,比如“name1=va&lu=e1” 参数值中出现&和=符号就会带来歧义,所以需要编码。
URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。