HTTP 必备基础
一、HTTP 常见状态码
1. 状态码分类
- 1xx 服务器收到请求
- 2xx 请求成功,如 200
- 3xx 重定向,如 302
- 4xx 客户端错误,如 404
- 5xx 服务端错误,如 500
2. 常见状态码
- 200 成功
- 301 永久重定向(配合 location, 浏览器自动处理)
- 302 临时重定向(配合 location, 浏览器自动处理)
- 304 资源未被修改(已经请求过资源,资源未过期)
- 404 资源没找到
- 403 没有权限
- 500 服务器错误
- 503 服务器不可访问
- 504 网关超时
二、HTTP Methods
1. 传统的 methods
- get 获取服务器的数据
- post 像服务器提交数据
- 简单的网页功能,就这两个操作
2. 现在的 methods
- get 获取数据
- post 新建数据
- patch / put 更新数据
- delete 删除数据
3. Restful API
- 一种新的 API 设计方法(早已推广使用)
- 传统 API 设计:把每个 url 当作一个功能
- Restful API 设计:把每个 url 当作一个唯一的资源
4. 如何设计成一个资源?
4.1 不用 url 参数
- 传统 API 设计: /api/list?pageIndex = 2
- Restfux API: /api/list/2
4.2 用 method 表示操作类型
传统 API 设计
- post 请求 /api/create-blog
- post 请求 /api/update-blog?id=100
- get 请求 /api/get-blog?id=100
Restfux API 设计
- post 请求 /api/blog
- patch 请求 /api/blog/100
- get 请求 /api/blog/100
三、HTTP Headers
1. Request Headers(常见请求头)
- Accept 浏览器可接收的数据格式
- Accept-Encoding 浏览器可接收的压缩算法,如 gzip
- Accept-Languange 浏览器可接收的语言,如 zh-CN
- Connection: keep-alive 一次 TCP 连接重复使用
- cookie
- Host 域名
- User-Agent(简称 UA) 浏览器信息
- Content-type 发送数据的格式,如 application/json
2. Response Headers(常见响应头)
- Content-type 返回数据的格式,如application/json
- Content-length 返回数据的大小,多少字节
- Content-Encoding 返回数据的压缩算法,如 gzip
- Set-Cookie 服务端设置 cookie
3. 自定义 Headers
headers: { 'X-Requested-With': 'XMLHttpRequest' }
4. 缓存 headers
强制缓存
Cache-Control
Expires
协商缓存
Last-Modified
If-Modified-Since
Etag
If-None-Match
四、http 缓存
1. 强制缓存
1.1 Cache-Control
在 Response Headers 中,控制强制缓存的逻辑
例:Cache-Control: max-age=31536000(单位是秒)
Cache-Control 的值
- max-age 过期时间
- no-cache 不做强制缓存交给服务端处理
- no-store 不让强制缓存也不让服务端做缓存
- private 允许最终用户做缓存
- public 允许中间一些路由和代理做一些缓存
- must-revalidate 必备
Cache-Control 过期之后还会再次请求服务端
1.2 关于 Expires
- 同在 Response Headers 中
- 同为控制缓存过期
- 已被 Cache-Control 代替
- 替代原因返回的到期时间是服务器端的时间,这样存在一个问题,如果浏览器所在机器的时间与服务器的时间相差很大,那么误差就很大
2. 协商缓存(对比缓存)
- 服务端缓存策略(服务端来判断一个资源是否被缓存,不是在服务端缓存)
- 客户端向服务器发送请求,服务器来判断客户端资源,是否和服务端资源一样
- 一致则返回 304,否则返回 200 和最新的资源
2.1 资源标识
- 在 Response Headers 中,有两种
- Last-Modified 资源的最后修改时间
- Etag 资源的唯一标识(一个字符串,类似人类的指纹)
再次请求的 If-Modifed-Since 的值就是出次请求的 Last-Modified 的值
再次请求的 If-None-Match 的值就是初次请求的 Etag 的值
2.2 Last-Modified 和 Etag
- 会优先使用 Etag
- Last-Modified 只能精确到秒级
- 如果资源被重复生成,而内容不变,则 Etag 更精确
五、三种刷新操作
- 正常操作: 地址栏输入 url, 跳转连接,前进后退等
- 手动刷新: F5,点击刷新按钮,右击菜单刷新
- 强制刷新: ctrl + F5
1. 不同刷新操作,不同的缓存策略
-
正常操作: 强制缓存有效,协商缓存有效
-
手动刷新: 强制缓存失效,协商缓存有效
-
强制刷新:强制缓存失效,协商缓存失效
六、HTTP 与 HTTPS 的区别
| 区别 | HTTP | HTTPS |
|---|---|---|
| 协议 | 运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份 | 身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之上, 是添加了加密和认证机制的 HTTP。 |
| 端口 | 80 | 443 |
| 资源消耗 | 较少 | 由于加解密处理,会消耗更多的 CPU 和内存资源 |
| 开销 | 无需证书 | 需要证书,而证书一般需要向认证机构购买 |
| 加密机制 | 无 | 共享密钥加密和公开密钥加密并用的混合加密机制 |
| 安全性 | 弱 | 由于加密机制,安全性强 |
1. 对称加密与非对称加密
HTTPS 采用对称加密与非对称加密的混合加密机制。
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方; 而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢。
综上:为了时效性我们还是需要选择对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。