携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
题目
- http 常见的状态码有哪些?
- http 常见的 header 有哪些?
- 什么是 Restful API
- 描述一下 http 的缓存机制(重要)
1. http 常见的状态码有哪些?
1.1 状态码的分类
-
1xx 服务器收到请求
-
2xx 请求成功,如 200
-
3xx 重定向,如 302
就是 我这不管了 我告诉你个地址,你去别的地方去
-
4xx 客户端错误, 如 404
-
5xx 服务端错误, 如 500
1.2 常见的状态码
-
200 成功
-
301 永久重定向(配合 location(新的地址),浏览器制动处理)
比如说自己的网站过期了,或者想换域名了,这个时候自己的老域名就会返回一个新的状态码,然后返回一个 location 一个新的域名
-
302 临时重定向(配合 location(新的地址),浏览器制动处理)
只是这次去访问一个新的地址,那我下次还是去访问老地址,看看有什么指令给我,或者说是不访问新的地址了,或者是location变了
-
304 资源未被修改
我们要去想服务端请求一个资源(js.css.json,html),这个时候服务端向你返回一个200,表示请求成功了,但是,如果你的浏览器请求过了(今天已经请求过了),你发送了一个一样的请求,服务端有可能会返回一个304,表示说 你刚刚的请求的资源已经请求过了,你的资源跟我这是一样的,你可以继续用你本地缓存的结果
-
403 没有权限 服务器拒绝请求
-
404 服务器找不到请求的网页
-
500 服务器错误,无法完成请求
-
504 网关超时
你能访问第一台服务器,但是第一台服务器连接其它服务器的时候 连接超时了
1.3 关于协议和规范
- 就是一个约定
- 要求大家都跟着执行
- 不要违反规定,例如 IE 浏览器
2. http 常见的 header 有哪些?
2.1. 常见的 Request Headers
-
Accept 浏览器可接收的数据格式
-
Accept-Encoding 浏览器可接受的压缩算法,如 gzip
可以用gzip压缩一下,就可以传输比较快,浏览器告诉服务器我可以接受gzip这个算法,浏览器就会根据 Accept-Encoding 去压缩 一般用gzip就可以了 这是前后端都通用的
-
Accept-Languange 浏览器可接受的语言,如 zh-CN 中文
-
Connection:keep-alive 一次 TCP 连接重复使用
我们和服务端建立了连接之后,我们就可以重复的去使用这个连接,把资源一次性解决完成,保持一个效率
-
cookie
我们同域请求一个资源的时候,都会把cookie带上
-
Host:请求域名是什么
-
User-Agent(简称 UA )浏览器信息
能标识出你是什么样的浏览器,甚至是什么样的系统
-
Content-type 发送数据的格式,如
application/json
比如说客户端要post发送数据的时候,会告诉服务端我们要的数据是什么格式的
2.2. 常见的 Response Headers
-
Contnet-type 返回数据的格式,如
application/json
服务端向客服端返回了是什么格式
-
Content-length 返回数据的大小,多少字节
-
Content-Encoding 返回数据的压缩算法,如gzip
服务端压缩之后还会通过 Content-Encoding 告诉你压缩的是什么格式 客户端就会像浏览器自动的去用压缩算法去解压,就可以用了
-
Set-Cookie 服务端要去改 Cookie 的时候,要通过 Set-Cookie 把 Cookie 改掉
2.3. 自定义 header
headers:{'x-Requested-With' : 'XMLHttpRequest'}
2.4. 缓存相关的 headers
- Cache-Control Expires
- Last-Modified If-Modified-Since
- Etag If-None-Match
后面会讲
3. 什么是 Restful API?
3.1. http method
3.1.1. 传统的 methods
- get 获取服务器的数据
- post 向服务器提交数据
简单的网页功能,就这两个操作
3.1.2. 现在的 methods
- get 获取数据
- post 新建数据
- patch/put 更新数据
- delete 删除数据
3.1.3. Restful API
- 一种新的 API 设计方法(早已推广使用)
- 传统 API 设计:把没个 url 当作一个功能
- Restful API 设计:把每一个 url 当作一个唯一的资源
如何时机成一个资源?
-
尽量不用 url 参数
- 传统 API 设计:
/api/list?pageIndex=2
- Restful API 设计:
/api/list/2
- 传统 API 设计:
-
用 method 表示操作类型(传统 API 设计)
- post 请求:
/api/create-blog
- post 请求:
/api/update-blog?id=100
- get 请求:
/api/get-blog?id=100
- post 请求:
-
用 method 表示操作类型(Restful API 设计)
- post 请求:
/api/blog
- post 请求:
/api/blog/100
- get 请求:
/api/blog/100
- post 请求:
4. http 缓存(重点)
4.1 关于缓存的介绍
4.1.1 什么是缓存 ?
什么可以把一些 没必要 重新获取 的 东西 重新获取
4.1.2 为什么要缓存?
我们要让页面加载的更快一些 你的CPU 页面的渲染都是很快的(毫秒级别) 但是网络请求的加载,特别是请求MySQL 这对CPU的计算和对页面的渲染都是很慢的 要尽量减少网络请求的数量 才能让页面加载更快一些 同理:我们把网络请求变得更快一些 那我们加载的更快一些
4.1.3 哪些资源可以被缓存?—— 静态资源( js css img )
网站的html不能被缓存 因为时刻要保持最新的 比如博客信息 我们的业务数据也是不能被缓存的
但我们的静态支援可以被缓存 因为缓存完毕后,不会改变了
4.2 http 缓存策略(强制缓存 + 协商缓存)
4.2.1 缓存机制
浏览器像服务器初次发起请求,请求成功了 服务器请求成功了 就会像浏览器返回资源 并加一个 Cache-Control
表示被缓存了,如果没有请求成功,就不会加 Cache-Control
当浏览器再次请求服务器的时候,会直接请求本地缓存 本地缓存肯定比服务器请求要快
disk cache
表示本地缓存的意思,没有去请求服务端 我们可以看到 Time 显示 3 毫秒 非常的快
如果有一天,时间太长了,缓存失效了 那么浏览器就会再次去请求服务端,服务端会重新返回资源和 Cache-Control
就又设置了一边过期时间
4.2.2 cache-control 的值
- max-age:设置缓存的最大过期时间
- no-cache:不用本地缓存 服务端怎么做我们不管
- no-store:我们不用本地缓存 而且我们不用服务端的一些缓存措施
- private:我们只能允许最终用户做缓存
- public:允许中间的一些路由,代理做缓存
4.2.3 Expires
- 同在 Response Headers 中
- 同为控制缓存过期
- 已被 Cache-Control 代替
Cache-Control 和 Expirse 都可以被浏览器兼容,如果两个一起出现,以 Cache-Control 为主
4.3 http 缓存 — 协商缓存
-
服务器端缓存策略
我们这个资源到了服务端之后,服务端告诉我这个资源没有改变,你可以直接用本地的就可以了,不用让我再给你一份了 也就是说 服务端判断这段资源能不能用缓存的内容,而不是说这个资源缓存到服务端
-
服务端判断客户端资源,是否和服务端资源一样
-
一致则返回 304 ,否则返回 200 和最新的资源
4.3.1 资源标识
-
在 Response Headers 中,有两种
服务端返回的永远会在 Response Headers 里面
-
Last-Modified 资源的最后修改时间
初次请求的时候 服务器会返回资源和 Last-Modified(最后修改的时间) 当浏览器再次向服务器发送请求的时候,请求头会带着 If-Modified-Since(也就是 Last-Modified 的键 它们两个的值是一样的 If-Modified-Since => Last-Modified) 然后服务器会通过这个值来判断是不是一样来返回 304 或者 新的 Last-Modified用与下次判断过期时间
- Etag
资源的唯一标识(一个字符串,类似人类的指纹) 浏览器向服务器初次请求的时候,如果成功,服务器会向浏览器返回资源和Etag 浏览器会记录下来 当再次请求的时候 会带一个 If-None-Match ,它的值其实求生上一次 Etag 这个字符串,当服务端看到他有 If-None-Match 这个值 他会重新计算资源并根Etag做对比,如果这个资源没有变过的话,那么 Etag 就不会变 就会返回 304 如果变过的话,会返回新的资源和 Etag
Last-Modified 是通过时间来做对比
Etag 是通过类似于指纹一样的唯一标识来做对比
4.3.2 Last-Modified 和 Etag 共存
- 有限使用 Etag
- Last-Modified 只能精确到秒级 (秒级对于计算机来说算是蛮宽泛的 因为计算机用毫秒)
- 如果资源被重复生成,而内容不变,则 Etag 更精确
4.4 刷新操作方式,对缓存的影响
4.4.1 三种刷新操作
- 正常操作:地址栏输入 url ,跳转连接,前进后退等
- 手动刷新:F5 ,点击刷新按钮 , 右击菜单刷新
- 强制刷新:Ctrl + F5
4.4.2 不同刷新操作,不同的缓存
-
正常操作:强制缓存有效,协商缓存有效
-
手动刷新:强制宣传失效,协商缓存有效
-
强制刷新:强制缓存失效,协商缓存失效
也就是说 不管多慢,也要给你最新的结果,所有的全部失效,全部返回200 返回最新的资源
小结
-
强制缓存 Cache-Control
这个必须要理解,掌握,面试中很有可能会考的
-
协商缓存 Last-Mondified 和 Etag ,304 状态码
这两种缓存必须了解 304 状态码必须要知道
-
完整的流程图
流程图必须自己画出来
\