在客户端与服务器之间,是基于网络来通信的。HTTP协议是最常用的一种网络通信协议(超文本传输协议)。平时我们用到的抢票软件就是通过抓包工具来构造HTTP请求来完成的。所以我们现在就来了解HTTP的相关知识。
零、
主流HTTP的版本是1.1
一、HTTP协议的报文格式
请求:客户端给服务器发送的数据
响应:服务器给客户端返回的数据
- 请求
- 首行:方法、URL、版本号
- 请求头、键值对结构:每个键值对占一行,键和值之间使用冒号空格分割
- 空行:相当于请求头的结束标志
- 正文:可选
- 响应
- 首行
- 响应头
- 空行:
- 正文:可选
请求
通过抓包工具来获取请求的具体内容
URL
URL:统一资源定位符,对应着互联网的某一资源地址
-
格式:
服务器地址:可以是一个IP地址,也可以是域名,但是IP地址不好记。
端口号:通常被隐藏起来。(对于HTTPS的请求,浏览器会自动加上443端口,因为一般的HTTPS服务器都是用 443;对于HTTP的请求,浏览器会自动加上80端口,一般的HTTP服务器都是用80) -
URL的部分内容是可以省略的:
-
省略域名:继续访问当前网站的其他资源
-
省略端口号:浏览器自动填充默认端口
-
省略带层次的路径:表示访问/目录
-
省略query string:本来就是可选的
片段标识符:也可以省略
-
-
URL中的url encode
C%2B%2B:URL里面有一些表示特定含义的符号(或者中文符号),如果query string中也含有这些字符,就会产生错误,我们就需要对其进行url encode
方法
请求报文中的首行的第一部分,使用较自由。触发请求
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
GET方法
-
直接在浏览器地址栏里输入一个URL,输入回车;或者点击浏览器收藏夹里面的链接
-
HTML中的一些标签
img有个src属性,写一个URL,浏览器会根据img中的src构造出对应的HTTP GET请求。同理,还有a中的href属性
-
还能使用JS,直接在浏览器前端构造出HTTP GET请求(ajax)
-
各种编程语言(只要能访问网络),就能构造出HTTP GET请求
GET请求的特点:
-
首行里面的第一部分是GET
-
URL里面的
query string
可以为空query string
:请求参数,在URL中?
的后面。本质上可以理解为一种序列化的格式,里面可以保存键值对。 -
GET请求里面有很多组header这样的键值对
-
GET请求一般body是空的。
GET请求长度是没有上限的。
-
POST方法
登录所用到的。
POST请求的特点:
- 首行的第一个部分,就是POST
- URL后面没有query string(一般都是没有的,个别情况会有)
- header有若干个键值对结构
- body一般不为空。body中的具体数据格式,由请求header中的Content-Type描述,具体长度由header中的Content-Length描述
GET和POST的区别
没有本质区别。
有一些细节区别:
-
(习惯上)GET把客户端的数据通过query string来传输,POST把客户端的数据通过body来传输
-
(习惯上)GET用于从服务器获取数据,POST是客户端给服务端提交数据。
-
要求把GET的请求的处理设置成“幂等”;POST请求的处理不要求实现成”幂等“
幂等:请求重复发送,不会产生负面影响
-
GET请求可以被缓存(浏览器的收藏夹),POST不行
请求报头 - header
表示在 HTTP 请求或响应中的用来传递附加信息的字段。
- Host
如果是POST请求,就会带上下面两个header
-
Content-Length:body的长度
-
Content-Type:body的格式
-
User-Agent:保存有当前浏览器的类型/版本,以及操作系统的类型、版本
UA最重要的意义就是用来区分请求是PC端还是移动端。(实际上很少这样做采取响应式布局)