这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
HTTP 简介
Hyper Text Transfer Protocol 超文本传输协议
应用层协议 基于 TCP 协议
请求 - 响应
简单可扩展
无状态
- HTTP/0.9 单行协议 响应仅支持HTML文档 仅支持GET请求方式
- HTTP/1.0 构建可扩展性 增加Header 增加状态码 支持多种文件类型
- HTTP/1.1 标准化协议 支持缓存 允许链接复用 内容协商
- HTTP/2 更进一步 二进制协议压缩 header 允许服务器推送
- HTTP/3 草案 ongoing
HTTP 结构
请求方法
- GET 获取资源
- POST 提交资源
- PUT 更新资源
- DELETE 删除资源
- HEAD
- CONNECT
- OPTIONS
- TRACE
- PATCH
safe 不会修改服务器数据的方法 GET HEAD OPTIONS
idempotent 同样请求被执行一次与执行多次效果一致且服务器状态一样 GET HEAD OPTIONS PUT DELETE
状态码
- 1xx 指示信息,请求已接收
- 2xx 成功,请求已被成功接收
- 3xx 重定向,完成请求需进一步操作
- 4xx 客户端错误,请求有语法错误或请求无法实现
- 5xx 服务器端错误,服务器无法实现合法的请求
- 200 OK
- 301 资源被永久转移至新地址
- 302 临时跳转
- 401 请求未经授权
- 404 请求资源不存在
- 500 服务器内部错误
- 504 网关或代理服务器无法获得需要的响应
RESTful API
Representational State Transfer
-
GET 获取资源
-
POST 新建资源
-
PUT 更新资源
-
DELETE 移除资源
-
URL 代表一种资源
-
客户端和服务端之间传递资源的表现层
-
客户端通过 HTTP 方法,对服务端资源进行操作,实现状态层转化
请求头
- Accept 接收类型,表示浏览器支持的MIME类型
- Content-Type 客户端发送的实体内容类型
- Cache-Control 指定请求和缓存遵循的缓存机制
- If-Modified-Since 用于匹配查看文件是否存在变动
- Expires 缓存控制,控制使用缓存而非直接请求的时间范围
- Max-Age 资源在本地的缓存时间长度
- If-None-Match 匹配文件是否改变
- Cookie 存在 cookie 且同域时会自动带上
- Referer 页面来源 URL,精确到详细页面地址
- Origin 请求源,精确到端口
- User-Agent 用户客户端必要信息
响应头
- Content-Type
- Cache-Control
- Last-Modified
- Expires
- Max-age
- ETag 资源特定版本标识符
- Set-Cookie 设置cookie
- Server 服务器一些相关信息
- Access-Control-Allow-Origin 服 务器允许请求Origin头部
缓存
强缓存
-
expires 时间戳
-
cache-control 可缓存性
-
可缓存性
- no-cache 协商缓存验证
- no-store 不使用缓存
-
到期
- max-age 存储最大周期
-
重新验证&重新加载
- must-revalidate 强制更新缓存,缓存过期后未验证或更新前无法使用
-
协商缓存
- Etag | If-none-match 资源特定版本
- Last-modified | If-modified-since 最后修改时间
Cookie
- name=value cookie的名称和值
- expries=date cookie有效期
- path=path 限制cookie发送范围的文件目录
- domain=domain 限制cookie生效域名
- secure 仅HTTPS连接可发送cookie
- HttpOnly 阻止js脚本读取cookie
- samesite=[ ... ] none同站跨站均可,strict同站可
HTTP 发展
HTTP/2
-
帧
- HTTP/2 通信的最小单位
- 每个帧包括帧头,至少包括当前帧所属数据流
- 是二进制
-
消息
- 与逻辑请求或响应对应的完整的一系列帧
-
数据流
- 已建立的连接内的双向数据流,可以承载一条或多条消息
- 允许数据交错发送
-
其他
- HTTP/2 连接是永久的,且单个来源只需一个连接
- 流控制 - 阻止发送方向接收方发送大量数据
- 允许服务器推送
HTTPS
经过 TSL/SSL 加密
- 对称加密 加密解密使用同一个密钥
- 非对称加密 加密解密使用两个不同的密钥 - 公钥&私钥
HTTP 场景分析
场景案例 - 静态资源
CDN content delivery network
缓存 + CDN + 文件名hash
场景案例 - 登录
不同域名提供登录API
HTTP 默认80端口
HTTPS 默认443端口
Session+cookie
JWT JSON web token
场景案例 - 跨域
- CORS
- 代理服务器
- Iframe
场景案例 - 用户体验
-
网络优化
- 开启http/2
- 数据压缩
- 域名 - 域名收敛及域名发散
- 预解析
<link rel="dns-prefetch" href="#"></link> - 预连接
<link rel="preconnect" href="#"></link>
-
稳定性
- 重试机制(超时、错误)
- 缓存
- 数据安全(HTTPS、劫持)
HTTP 实战
浏览器 - XMLHttpRequest
- 0 UNSENT 代理创建
- 1 OPENED 调用open方法
- 2 HEADERS_RECEIVED 调用send方法
- 3 LOADING 下载中
- 4 DONE 下载完成
浏览器 - fetch
- promise化
- 模块化设计
Node - http | https
- node环境默认模块
浏览器&Node - axios
- 请求库
- 支持浏览器环境和nodejs环境
其他
websocket
浏览器和服务器进行全双工通讯
URL以ws或wss开头
QUIC
Quick UDP Internet Connection