网络原理— HTTP 请求(Request)
认识URL
1. URL 基本格式
平时我们俗称的 “网址” 其实就是说的 URL
(Uniform Resource Locator 统一资源定位符
);
互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置,以及浏览器应该怎么处理它;
URL的详细规则由因特网标准RFC1738
进行了约定.(因特网标准 RFC1738)
一个具体的URL:
https://v.bitedu.vip/personInf/student?userId=10000&classId=100
可以看到,在这个URL中有些信息被省略了;
https:
- 协议方案名;
- 常见的有http和https,也有其他的类型;(例如访问mysql时用的jdbc:mysql)
user:pass:
- 登陆信息;
- 现在的网站进行身份认证,一般不再通过URL进行了,一般都会省略
v.bitedu.vip:
- 服务器地址(IP地址),用于定位一个主机;
- 此处是一个"域名",域名会通过
DNS 系统
解析成一个具体的IP地址; - (通过
ping
命令可以看到,v.bitedu.vip 的真实IP地址为118.24.113.28
)
端口号:
- 每个应用程序在使用网络时,都会关联一个空闲的端口号;
- 通过 IP 定位一台主机,通过端口号区分主机上使用网络的多个应用程序;
- 当端口号省略的时候,浏览器会根据
协议类型
自动决定使用哪个端口; - 例如 http 协议默认使用
80端口
,https协议默认使用443端口
;
回忆五元组:源端口,源 ip,目的端口,目的 ip,协议类型;
http 协议默认使用
80端口
,https协议默认使用443端口
,站在客户端的角度,两种协议访问的端口是远端服务器的端口(目的端口)
,不是浏览器自身的客户端端口
(源端口);
/personInf/student:
- 带层次结构的
文件路径
,每一层都是一个目录;
userId=10000&classId=100:
- 查询字符串
(query string)
,本质是一个键值对
结构; - 键值对之间使用
&
分隔; - 键和值之间使用
=
分隔.
片段标识:
- 片段标识主要用于
页面内跳转
.
例如Vue官方文档:
- 通过不同的片段标识跳转到文档的不同章节
2. 使用 ping 命令查看域名对应的IP地址
- 在开始菜单中输入
cmd
,打开命令提示符 - 在
cmd
中输入ping v.bitedu.vip
,即可看到域名解析
的结果.
PS:
有的电脑上 ping 命令会报错 ping
不是内部或外部命令,也不是可运行的程序或批处理文件
;这种情况是因为有的 Windows10 默认没有启用 ping 命令;
百度搜索 windows10 启用 ping 即可;
3. query string
- query string中的内容是
键值对结构
; - 其中的 key 和 value 的
取值
和个数
,完全都是程序猿自己约定的; - 我们可以通过这样的方式来自定制传输我们需要的信息给服务器.
4. URL中的可省略部分
协议名:
- 可以省略,省略后默认为http://
ip地址/域名:
- 在
HTML
中可以省略(比如 img , link , script , a 标签的src
或者href
属性); - 省略后,表示
服务器的 ip/域名
与当前HTML所属的 ip/域名
一致
端口号:
- 可以省略,省略后如果是
http
协议,端口号自动设为80
; - 如果是
https
协议,端口号自动设为443
.
带层次的文件路径:
- 可以省略,省略后相当于
/
; - 有些服务器会在发现
/路径
的时候自动访问/index.html
查询字符串:
- 可以省略
片段标识:
- 可以省略
5. 关于URL encode
像/
?
:
#
&
=
…等这样的字符,已经被 URL 当做特殊意义理解了;因此这些字符不能随意出现;
某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义; |
一个
中文字符
等非英文系的文字,由UTF-8
或者GBK
这样的编码方式构成,虽然在URL中没有特殊含义,但是仍然需要进行转义
;否则
浏览器
可能把 UTF-8/GBK 编码中的某个字节
,当做URL中的特殊符号
;只不过很多浏览器为了用户看起来方便,显示 URL 某个参数的时候,
显示的是转义之前的字符
;实际上,我们可以
通过抓包查看真实的数据
,已经是转义之后的数据;
我们在搜索框中输入中文,可以看见 URL 的其中一个
query string 键值对
中,对属性
的赋值还是中文;
我们使用
fiddler
来对刚刚的访问操作进行抓包:
在记事本中打开
HTTP请求
的详细信息,我们发现属性赋值的真实数据是”你好“转义后的结果:
转义这样的操作非常重要,如果没有进行转义,就可能会使浏览器或者服务器无法正确解析,请求就会失败。
转义的规则如下: |
将需要转码的字符转为
16进制
,然后从右到左
;取4位(不足4位直接处理),每2位做一位,前面加上%,编码成
%XY
格式;
例如:
"+"
被转义成了"%2B"
urldecode 就是 urlencode 的逆过程
;
如果要使用逆过程 urldecode ,可以把 utf-8 中的 % 去掉,然后使用 urldecode ,就可以拿到转义前的数据;