初始HTTP
HTTP,Hyper Text Transfer Protocol 超文本传输协议,是一个应用层(Application) 的协议,其基于传输层的TCP协议。
-
每个HTTP的请求/报文可分为 请求Request 和 响应Response 两部分
-
简单的可扩展协议
-
无状态(stateless)协议
- 请求之间相互独立
1、HTTP请求方法
| Method | 定义 |
|---|---|
| GET | 请求一个指定资源的表示形式,只被用于获取数据 |
| POST | 用于被实体 提交到 指定资源,通常导致在服务器上的状态变化 |
| PUT | 用请求有效载荷 替换 目标资源的所有当前表示,即从客户端向服务器传送的数据取代指定的文档的内容 |
| DELETE | 删除指定的资源 |
| HEAD | 请求一个与GET请求的响应相同的响应,但没有响应体 |
| CONNECT | 建立一个到由目标资源标识的服务器的隧道 |
| OPTIONS | 用于描述目标资源的通信选项 |
| TRACE | 沿着到目标资源的路径执行一个消息环回测试 |
| PATCH | 用于对资源应用进行局部修改,是对PUT请求的补充 |
-
Method分类:
-
Safe(安全):
不会修改服务器的数据的方法,如
GETHEADOPTIONS -
Idempontent(幂等):
同样的请求被执行一次与连续执行多次的效果时一样的,服务器的状态也是一样的
所有safe的方法都是idempotent的,如
GETHEADOPTIONSPUTDELETE
2、状态码
2.1 常见状态码
| 状态码 | 含义 |
|---|---|
| 200 OK | 客户端请求成功 |
| 301 Moved Permanently | 资源(网页等)被永久转移到其它URL |
| 302 Found | 临时跳转 |
| 401 Unauthorized | 请求未经授权 |
| 404 Not Found | 请求资源不存在,可能是输入了错误的URL |
| 500 Internal Server Error | 服务器内部发生了不可预期的错误 |
| 504 Gateway Timeout | 网关或者代理的服务器无法在规定的时间内获得想要的响应 |
3、RESTful API
-
一种API设计风格
-
RESTful:用
URL定位资源、用HTTP动词(GET、POST、PUT、DELETE)描述操作 -
REST,Representational State Transfer
1、每一个URI代表一种资源(资源的唯一标识)
2、客户端和服务器之间,传递这种资源的某种表现层;
3、客户端通过HTTP method,对服务器端资源进行操作,实现"表现层状态转化"。
| 请求 | 返回码 | 含义 |
|---|---|---|
| GET /zoos | 200 OK | 列出所有动物园,服务器成功返回了 |
| POST /zoos | 201 CREATED | 新建一个动物园,服务器创建成功 |
| PUT /zoos/ID | 400 INVALID REQUEST | 更新某个指定动物园的信息(提供该动物园的全部信息)用户发出的请求有错误,服务器没有进行新建或修改数据的操作,需修改请求的内容后再次发送请求 |
| DELETE /zoos/ID | 204 NO CONTENT | 删除某个动物园,删除数据成功 |
4、采用请求头
| 请求头 | 定义 |
|---|---|
| Accept | 接收类型,表示浏览器支持的MIME类型(对标服务端返回的Content-Type) |
| Content-Type | 客户端发送出去实体内容的类型 |
| Cache-Control | 指定请求和响应遵循的缓存机制,如no-cache |
| If-Modified-Since | 对应服务端的Last-Modified,用来匹配看文件是否变动,只能精确到1s之内 |
| Expires | 缓存控制,在这个时间内不会请求,直接使用缓存,服务端时间 |
| Max-age | 代表资源在本地缓存多少秒,有效时间内不会请求,而是使用缓存 |
| If-None-Match | 对应服务端的ETag,用来匹配文件内容是否改变(非常精确) |
| Cookie | 有cookie并且同域访问时会自动带上 |
| Referer | 该页面的来源URL(适用于所有类型的请求,会精确到详细页面地址,csrf拦截常用到这个字段) |
| Origin | 最初的请求是从哪里发起的(只会精确到端口),Origin比Referer更尊重隐私 |
| User-Agent | 用户客户端的一些必要信息,如UA头部等 |
5、常用响应头
| 响应头 | 定义 |
|---|---|
| Content-Type | 服务端返回的实体内容的类型 |
| Cache-Control | 指定请求和响应遵循的缓存机制,如no-cache |
| Last-Modified | 请求资源的最后修改时间 |
| Expires | 应该在什么时候认为文档已经过期,从而不再缓存它 |
| Max-age | 客户端的本地资源应该缓存多少秒,开启了Cache-Control后有效 |
| ETag | 资源的特定版本的标识符,Etags类似于指纹Set-Cookie设置和页面关联的cookie,服务器通过这个头部把cookie传给客户端 |
| Server | 服务器的一些相关信息 |
| Access-Control-Allow-Origin | 服务器端允许的请求Origin头部 |
6、缓存
缓存可分为 强缓存 和 协商缓存
6.1 强缓存
-
Expires
response header里的过期时间,浏览器再次加载资源时,如果在这个过期时间内,则命中强缓存
-
Cache-Control
Cache-Control 出现于 HTTP/1.1
Cache-Control 有很多属性,不同的属性代表的意义也不同:
1.可存储性
no-cache不使用强缓存,需要与服务器验协商缓存验证。no-store缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。2、到期
max-age单位为秒,缓存存储的最大周期,相对于请求的时间超过这个周期被认为过期。3、重新验证/重新加载
must-revalidate一旦资源过期,在成功向原始服务器验证之前,不能使用
6.2 协商缓存
-
ETag/If-None-Match
资源的特定版本的标识符,即资源指纹
上一次返回的Etag值放到
request header里的If-None-Match里。服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值做比较。如果相同,则表示资源文件没有发生改变,命中协商缓存。
-
Last-Modified/If-Modified-Since
文件的最后修改时间
强缓存 & 协商缓存: 配合使用,可争取最大化的减少请求,利用缓存、节约流量。
6.3 缓存流程图
7、cookie
set - cookie - response的设置:
| 参数 | 定义 |
|---|---|
| Name=value | 各种cookie的名称和值 |
| Expires=Date | cookie的有效期,缺省时cookie仅在浏览器关闭之前有效 |
| Path=Path | 限制指定cookie的发送范围的文件目录,默认为当前 |
| Domain=domain | 限制cookie生效的域名,默认为创建cookie的服务域名 |
| secure | 仅在HTTPS安全连接时,才可以发送cookie |
| HttpOnly | JavaScript 脚本无法获得cookie |
- 在网页登录请求发送后,获得以下数据
HTTP/2
更快、更稳定、更简单
1、基本概念
-
**帧(frame) **: HTTP/2 通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流
-
二进制
一条HTTP响应,划分成了两个帧来传输,并且采用二进制的形式编码,即二进制帧
2、多路复用
- 交错发送,接收方重组织
- 通过逐个发送的单个流接收成吨的媒体内容既低效又消耗资源
- 允许客户端和服务器将HTTP有效负载分解为小型、独立和可管理的交错帧序列。然后在另一端
重新组装此信息
3、服务器推送
服务器端推送使得服务器可以预测客户端需要的资源,主动推送到客户端。
例如,如果客户端请求资源X并且知道资源Y被请求的文件引用,则服务器可以选择将Y与X一起推送,而不是等待适当的客户端请求
HTTPS
Hypertext Transfer Protocol Secure,超文本传输安全协议 ,是一种通过计算机网络进行安全通信的传输协议。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS- 和http相比,https只是多一层保障数据安全的TLS/SSL协议
- TLS/SSL协议,全程为安全传输层协议Transport Layer Security, 是介于TCP和HTTP之间的一层安全协议,是位于传输层与应用层之间的加密协议
总结
HTTP协议的发展说明着,用户的需求是推动技术发展的主要动力。技术还在不断发展进步,我们的学习任重道远,但也只有不断学习才能与时俱进、不被时代淘汰。