这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天。
本篇笔记是对今天青训营的HTTP课程的归纳总结及个人感悟。
一、初识
1, HTTP 协议
-
超文本传输协议
-
应用层协议,基于TCP协议
-
请求响应两部分
-
简单可扩展
-
无状态:没有记忆能力,每个请求都是独立的
2, 发展
最初的HTTP/0.9单行协议,请求GET/mypage.html,响应只有HTML文档
到现在HTTP/3草案
二、协议分析
1, 方法
-
Safe Methods 不会修改服务器的数据的方法, GET/HEAD/OPTIONS
-
Idempotent(幂等) Methods 同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态样式一样的, GET/HEAD/OPTIONS/PUT/DELETE
-
所有safe的方法都是idempotent的
2, 缓存
A 强缓存:
Expires,时间戳
Cache-Control:
a 可缓存性:
1. No-cache 协商缓存验证
2. No-store 不使用任何缓存
b 到期:
Max-age 单位是秒,存储的最大周期,相对于请求的时间
c 重新验证 * 重新加载
Must-revalidate 一旦资源过期,在成功向原始服务器验证之前,不能使用
B协商缓存
-
Etag/If-None-Match 资源的特定版本的标识符,类似于指纹
-
Last-Modified/If-Modified-Since 最后修改时间
3, HTTPS
-
经过TSL/SSL加密
-
对称加密 加密和解密都是使用同一个密钥
-
非对称加密 加密和解密需要使用两个不同的密钥 公钥和私钥
三、场景分析
静态资源方案: 缓存+CDN+文件名hash
CDN:Content Delivery Network
通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务
四、一些实战案例
AJAX:
XHR:
-
UNSET 代理被创建,但尚未调用open()方法
-
OPENED open()方法已被调用
-
HEADERS_RECEIVED send()方法已被调用,并且头部和状态已可获得
-
LOADING 下载中,responseText属性已经包含部分数据
-
DONE 下载操作已完成
Fetch :
-
XMLHttpRequet的升级版
-
使用Promise
-
模块化设计,Response,Request,Header对象
-
通过数据流处理对象,支持分块读取
Node:
-
标准库:HTTP/HTTPS
-
默认模块,无需安装其他依赖
-
功能有限/不是十分友好
-
常用的请求库:axios
-
支持浏览器、nodejs环境
-
丰富的拦截器