文章目录
- HTTP协议
- 什么是HTTP协议
- HTTP协议格式
- 抓包工具的使用
- HTTP请求
- URL
- URL的组成
- URL encode
- HTTP请求的报文格式
- HTTP响应的报文格式
- HTTP方法
- GET方法
- POST方法
- POST方法与GET方法的区别
- 请求报头
- HTTP响应
- 状态码
- 状态码的组成
- 状态码的类别
HTTP协议
什么是HTTP协议
HTTP协议即Hyper Text Transfer Protocol(超文本传输协议),是用于服务器与本地浏览器超文本的传输的传送协议。HTTP基于TCP/IP通信协议传输数据。是一种应用广泛的应用层协议。
如图,我们这里打开的百度网址实际上就是通过HTTP协议来传输数据的。当输入一个网址,按下回车的同时,浏览器就会给百度的服务器发送一个HTTP请求,相应地,百度的服务器也会返回给浏览器一个HTTP响应。响应结果经浏览器解析,反馈给用户,即页面展示成功。但是当我们访问一个网站的时候,一般这样的HTTP请求/响应的交互过程时有多次的。
通过F12打开chrome的开发者工具,就可以在“网络”标签页找到关于HTTP请求/响应的记录:
HTTP协议格式
抓包工具的使用
尽管使用Chrome的开发者工具也可以达到抓包的目的,但其提供的功能有限,使用感不如专门的抓包工具,因此我们推荐使用Fidder,一种功能丰富但易上手的抓包工具。下面附上Fidder的下载地址:https://www.telerik.com/fiddler/
这就是Fidder的页面情况,左侧是HTTP的请求列表,双击任意一条请求,右侧就是请求的详细信息,其中右侧上方就是HTTP请求的详细信息,右侧下方是HTTP响应的详细信息。
所谓抓包工具,实际就是浏览器与服务器交互过程中的“中间商”,浏览器在访问一个网站时,首先把HTTP请求发给Fidder,由Fidder将请求转发给对应网站的服务器,当服务器对请求做出响应时,同样是经由Fidder转发给浏览器,因此Fidder对于浏览器与服务器之间的交互自然是十分清楚的。
HTTP请求
URL
所谓URL就是我们俗称的“网址”,对于互联网上的文件,URL都是存在且唯一的,它包含了文件的位置等相关信息;
URL的组成
URL的组成元素中包含了许多有用的信息:
- https :协议方案名,常见的有http和https,可以省略,省略时默认是http://;
- user:pass :登录信息,一般省略;
- www.xxxxxx :服务器的地址,属于一个“域名”,如果需要得到具体的IP地址,可以使用ping命令;
- 一个数字:端口号,可以省略,http默认端口号80,https默认端口号443;
- 带层次的文件路径:可以省略,省略后相当于/. ;
- 查询字符串:是一个键值对的结构,可以省略;
- 片段标识符:主要用于页面内跳转,可以省略;
下面是百度的URL:
URL encode
对于一个完整的URL,除了上面URL的组成部分外,还有一些像’/’ ‘?’ ':'等这样的字符,这些字符是被URL赋予了特殊意义的字符。因此为了避免无效URL的出现,如果在URL的某一组成部分中出现了类似字符,就需要对这些字符首先进行转义。n
具体的转义规则和转义情况,这里不做过多介绍,如果确需转义,一般使用在线的urlencode 工具即可;
HTTP请求的报文格式
下面是访问“百度”时,使用抓包工具捕捉到的信息:
HTTP请求主要有这样几部分组成:
-
首行,即请求的第一行
-
请求报头 header
请求报头的整体格式是键值对的形式;
键和值之间以分号进行分割;
报头的种类有多种:
- 空行;
空行是请求报头的结束标记
- 正文(body)
并非所有的HTTP请求都有正文,这取决于用户对网站的具体访问情况;
HTTP响应的报文格式
使用抓包工具捕捉到的一段HTTP响应:
HTTP响应的组成:
- 首行
- 响应报头
与请求报头类似,也是键值对的形式;
- 空行;
同样作为报头的结束标志;
- 响应正文;
响应正文即服务器返回给浏览器的数据;
HTTP方法
HTTP协议的方法有许多种,这里只介绍最常见几种:
GET方法
Get方法是很常用的HTTP方法,GET方法最初产生的原意是为了获取服务器上的资源,但随着具体生产情景的不断变化,GET方法的应用场景也变得越来越广泛;
我们每在浏览器中输入一个URL并按下回车键,浏览器就会发送给服务器一个GET请求;
HTML中的一些标签,同样也会触发GET请求;
GET请求的URL的长度取决于浏览器和服务器,官方的HTTP协议标准并未对其长度做出限制;
GET请求的特点:
- 首行的第一部分为GET;
- 请求正文为空;
- URL的query string 可以为空,也可以不为空;
POST方法
POST方法同样也是一种很常见的HTTP方法,将用户输入的数据提交给服务器是POST方法的初心,但也随着开发场景的不断变化而有了更多的用途;
POST方法的特点:
- 首行的第一部分为POST;
- URL的query string 一般为空,但不是一定的;
- body部分一般不为空;
POST方法与GET方法的区别
实际上,POST方法与GET方法没有本质区别,两者的区别主要是体现在使用习惯上:
- GET方法主要用于获取数据,POST方法主要用于提交数据给服务器;
- GET方法主要通过query string 来传递数据,POST方法主要使用body部分来传递数据;
- GET请求一般建议“幂等”,POST方法没有特殊要求幂等;
- GET方法获取到的数据一般可以进行缓存,而POST方法得到的数据一般不被缓存;
两者之间的区别都不是绝对的,在很多时候两种方法之间是可以相互替代的;
请求报头
HTTP协议的请求报头的种类也有多种,这里也仅仅介绍较为常见的:
- HOST
访问的服务器主机的地址与端口; - Content-Length;
body中的数据长度; - Content-Type;
请求中body的数据格式;
这2种都需要搭配body来使用;
关于HTTP请求的body的数据格式:
1.json;
2.urlencodes;
form-data;
- User=Agent(UA)
表示浏览器和操作系统的大致属性;
- Referer;
表示该页面由哪一个页面跳转而来,不是一定存在的,如果是直接通过收藏夹访问到的页面就不会有该报头; - Cookie
Cookie是浏览器在本地存储数据的一种机制;
一般情况下,用户的数据都是存储在服务器的,但是如果仅仅存在服务器,如果用户重复某种操作(例如登录),就总是需要去访问服务器,为了简化一些操作,避免重复多次地做相同的操作,我们就尝试在浏览器中存储一些信息;
但是为了用户的安全,对于浏览器的存储操作,必须做出限制,只有在限定条件下,浏览器才有访问少量磁盘的权利,来达到存储一些用户信息的目的;
在浏览器页面,点击这个“小锁头”的图标,就可以看到当前页面的Cookie;
HTTP响应
状态码
HTTP状态码显示客户端HTTP请求的返回结果及标记服务器端的处理是否正常,可以简单理解为访问一个页面的访问结果,包括访问成功,访问失败或者其他情况。
状态码的组成
状态码一般是由3位数字和相关原因短语组成,其中数字中的第一位指定了响应类别。像 200 OK;
状态码的类别
状态码的响应类别有下面5种:
状态码的类别有以上5种,而真正存在的状态码则有几十种之多,此处只介绍比较常见的几种状态码:
-
200 OK;
最常见的一个状态码,表示访问成功,客户端发送的请求在服务器端被正常处理; -
304 Not Modified;
表示 客户端发送了附带条件的请求,服务器端允许请求的访问资源,但未满足条件的情况; -
400 Bad Request;
请求报文中存在语法错误; -
403 Forbidden ;
对请求资源的访问被服务器拒绝了; -
404 Not Found;
在服务器上无法找到请求的资源或服务器端拒绝请求且不想说明理由;
4xx的响应结果表明客户端是发生错误的原因所在;
- 500 Internal Server Error;
服务器出现内部错误; - 504 Gateway Timeout;
服务器处理请求超时;
5xx的响应结果表明服务器本身发生错误;
over!