这是我参与「第四届青训营 」笔记创作活动的的第7天
一. 初识HTTP
1. 输入URL到出现页面发生了什么?
- 输入信息 -> 浏览器 -> 浏览器内核(发起请求给Internet网络,读取响应,渲染)-> 页面加载完成
- 经过了三个大体过程:browser进程;浏览器内核;Internet网络server服务器。
2. 什么是HTTP
- 超文本传输协议
- 应用层协议,基于TCP协议。
- 请求 响应
- 简单可扩展
- 无状态
二. HTTP协议分析
1. 持续发展
- HTTP/0.9单行协议:请求只有GET/mypage.html,响应只有HTML文档...
- HTTP/1.0构建可扩展性:增加了Header,有了状态码,支持了更多语义,支持多种文档类型...
- HTTP/1.1标准化协议:链路复用,缓存,内容协商...
- HTTP/2更优异的表现:二进制协议,压缩header,服务器推送...
- HTTP/3草案
2. 报文解析
📶 2.1. http1.1
起始行: 请求(Method Path Version)、响应(Version StatusCode StatusMessage)
HTTP Headers: 请求头、响应头
空行
body: 请求体、响应体
🔂 2.1.1. 方法
安全性Safe:不会修改服务器的数据的方法,GET HEAD OPTIONS。
幂等性Idempontent:同样的请求被执行一次与连续执行多次的效果时一样的,服务器的状态也是一样的,所有safe的方法都是idempotent的,GET HEAD OPTIONS PUT DELETE。
| 方法名 | 描述 |
|---|---|
| GET | 请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据 |
| POST | 用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用 |
| PUT | 用请求有效载荷替换目标资源的所有当前表示 |
| DELETE | 删除指定的资源 |
| HEAD | 请求一个与GET请求的响应相同的响应,但没有响应体 |
| CONNECT | 建立一个到由目标资源标识的服务器的隧道 |
| OPTIONS | 用于描述目标资源的通信选项 |
| TRACE | 沿着到目标资源的路径执行一个消息环回测试 |
| PATCH | 用于对资源应用部分修改 |
🔂 2.1.2. 状态码
- 常见状态码及含义
| 状态码 | 含义 |
|---|---|
| 200 OK | 客户端请求成功 |
| 301 Moved Permanently | 资源(网页等)被永久转移到其它URL |
| 302 Found | 临时跳转 |
| 401 Unauthorized | 请求未经授权 |
| 404 Not Found | 请求资源不存在,可能是输入了错误的URL |
| 500 Internal Server Error | 服务器内部发生了不可预期的错误 |
| 504 Gateway Timeout | 网关或者代理的服务器无法在规定的时间内获得想要的响应 |
-
RESTful API
RESTful API:一种API设计风格,全称为REST - Representational State Transfer。
- 每一个URI代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过HTTP method,对服务器端资源进行操作,实现"表现层状态转化"。
| 请求 | 返回码 | 含义 |
|---|---|---|
| GET /zoos | 200 OK | 列出所有动物园,服务器成功返回了 |
| POST /zoos | 201 CREATED | 新建一个动物园,服务器创建成功 |
| PUT /zoos/ID | 400 INVALID REQUEST | 更新某个指定动物园的信息(提供该动物园的全部信息)用户发出的请求有错误,服务器没有进行新建或修改数据的操作 |
| DELETE /zoos/ID | 204 NO CONTENT | 删除某个动物园,删除数据成功 |
-
传统API与RESTful API的区别
传统API:把每个URL当作一个功能
Restful API: 把每个URL当作一个唯一的资源
用 URL 定位资源,用 HTTP 动词(GET,POST,DELETE,PUT)描述操作,尽量不用URL参数,用method表示操作类型
① url参数
传统API :/api/list?pageIndex=2
Restful API :/api/list/2
② method表示操作类型
传统API
POST请求 /api/create-blog POST请求 /api/update-blog?id=100 GET请求 /api/get-blog?id=100Restful API
POST请求 /api/blog PATCH请求 /api/blog/100 GET请求 /api/blog/100
🔂 2.1.3. 请求头
Header首部和请求方法配合工作,共同决定了客户端和服务器能做什么事情。
- 常用请求头
- 常用响应头
- 缓存相关请求头
和缓存相关的协议首部Header
强制缓存:
Cache-Control (Response Headers)
max-age 设置缓存有效时间
no-cache 不用本地强制缓存,让服务端处理缓存
no-store 不强制缓存,不让服务端处理缓存,直接返回资源
private 只能允许最终用户做缓存
public 允许中间路由、代理做缓存
Expires (Response Headers) 控制缓存过期,已被Cache-Control代替
协商缓存:
Last-Modified [资源标识] 资源最后修改时间
Etag [资源标识] 资源唯一标识(一个字符串,类似人类的指纹)
服务端缓存策略:
服务端判读客户端资源,是否和服务端资源一样
一致返回304,否则返回200和最新的资源
- cookie
HTTP是无状态的协议,需要设置cookie保持状态。
📶 2.2. http2
HTTP1.1响应是文本格式,而HTTP2.0把响应划分成了两个帧,HEADERS(首部)和 DATA(消息负载) 是帧的类型。
一条HTTP响应,划分成了两个帧来传输,并且采用二进制来编码。
- 消息(Message): 与逻辑请求或响应消息对应的完整的一系列帧。特定消息的帧在同一个流上发送,这意味着一个HTTP请求或响应只能在一个流上发送。
- 数据流(Frame): 已建立的TCP连接内的双向字节流,可以承载一条或多条消息。
- HTTP/2 连接都是永久的,而且仅需要每个来源一个连接。
- 流控制:阻止发送方向接收方发送大量数据的机制。
🔂 2.2.1. 多路复用
交错发送,接收方重组织。HTTP2建立一个TCP连接,一个连接上面可以有任意多个流(stream),消息分割成一个或多个帧在流里面传输。帧传输过去以后,再进行重组,形成一个完整的请求或响应。这使得所有的请求或响应都无法阻塞。
🔂 2.2.2. 服务器推送
服务器端推送使得服务器可以预测客户端需要的资源,主动推送到客户端。
📶 2.3. https
HTTPS:Hypertext Transfer Protocol Secure,https是在http基础上进行了一个TSL/SSL加密。
对称加密:加密和解密都是使用同一个密钥。
非对称加密:加密和解密需要使用两个不同的密钥:公钥(public key)和私钥(private key)。