1 前情回顾
上一篇我们初步学习了HTTP的报文格式,借助抓包工具fiddler来分析HTTP协议格式:
- 请求:首行 方法+URL+版本号;请求头 ;空行;正文body
- 响应:首行 版本号+状态码+状态码描述;响应头;空行;正文
下面我们继续了解HTTP相关知识。
2 HTTP协议相关细节
2.1 URL(唯一资源定位符)
- URL:唯一资源定位符,用来找到网络上的资源;
- URI:唯一资源标识符,用来区分网络上的资源;
以上两个概念十分相似,很多时候都不会进行区分。
URL是我们常见常用的网址,例如https://www.baidu.com等。在URL中有RFC标注文档进行表述,此文档描述了很多网络中的协议标准,例如IP、TCP、UDP、HTTP……
URL格式:
- 服务器地址:IP地址,也可以写作域名,域名和IP地址是一个等价的关系,DNS域名解析系统能够将域名自动转换成IP地址,确定主机。
- 服务器端口号:标识了要访问的目标服务器的哪个进程。浏览器的端口号经常会省略不写,使用当前协议的默认端口号,http:80 https:443
- 资源路径:服务器进程可能会提供很多资源,可以使用带层次的文件路径访问到具体的资源。
- 查询字符串:?后面是键值对结构,称为query string(查询字符串)相当于浏览器给服务器传递的一些必要的参数,此处的查询字符串是通过“键值对”格式来组织的,键值对之间使用 & 运算分割,键和值之间使用 = 分割,其内容完全是自定义的,是前后端交互数据的重要桥梁。
- 片段标识符:片段标识符用来区分一个网页中的哪个部分,常见于小说或者文档标识符,借助片段标识符快速跳转到网页的某个部分,例如点击文档的目录标题,跳转到对应的文档内容,或者从小说的某个章节标题跳转到章节内容。
2.2 URL重要部分
- IP地址+端口号(基础);
- 带层次的资源路径;
- 查询字符串(前后端交互数据的重要桥梁);
- URL encode/decode。
URL encode/decode:
由于URL中包含一些特殊含义的符号,比如 :/ @
如果query string的value中也包含了特殊字符很可能会出现浏览器错误识别从而导致服务器错误解析。
使用 URL encode 把特殊符号和汉字进行转义,例如在百度上搜索c++ 转义后的结果就是c%2B%2B,转义规则就是把待转义的字符串每个字符用十六进制表示,每个字节前面加上一个%。(两个十六进制刚好是一个字节)。把原始的字符转换成转义后的字符就叫URL encode(编码),反之把转义后的字符还原成转义前的字符就是URL decode(解码)。虽然有第三方库可以直接编码解码,但是我们在写代码的事情也必须要考虑这个问题。