随便说一个响应码,你敢答应吗

103 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

前言

响应码伴随着前后端联调的始终,也是HTTP协议中的一个重要的部分,今天我们梳理一下所有的响应码,以及这些响应码背后的知识;先把所有响应码列成一个表格:

响应码含义备注(*号的需要牢记)
1xx请求正在处理*
100继续
101交换协议
2xx请求成功*
200成功
201已创建
202接收
203非权威信息
204无内容没有内容为什么不返回200呢?
205重置内容
206部分内容经常用在范围请求中
3xx重定向*
300多选择
301永久重定向*
302临时重定向*
302
303
304未修改*
305使用代理
306未使用
307临时重定向
4xx客户端错误*,注意不一定是前端的错
400请求错误
401无授权*
402所需付款
403禁止访问*
404未找到*
405方法不允许*
406不可接受
407需要代理身份验证
408请求超时
409冲突

204

返回的Response只有Header和状态行,没有response body,通常用来查看Header看看资源是否被修改

206

206代表服务器已经成功处理了部分GET请求,其他请求不会发送此状态码

  1. 实现断点续传

  2. 分片下载:比如说在线看一个很大的视频,一般都是边看边下载;浏览器会不断发送206请求,得到的内容就是缓冲,当缓冲完了整个视频就都可以观看任意进度了

301 302

301是永久重定向,302是临时重定向,它们有什么区别呢?

主要是对于SEO的影响,对301搜索引擎会把301之前的网站等同于301跳转之后的,而如果网站出现302那么搜索引擎会认为网站不稳定而直接忽略掉,所以要做SEO排名的网站不要有302响应码

301,302都可以在Nodejs中配置,以express为例

const app = express();
app.use('/redirect',(req,res)=>{
    res.redirect(301,"//www.baidu.com")
})

304

协商缓存,这个状态码非常重要

304对应的两种缓存策略,一个是etag / if-none-match:服务端返回资源时,如果头部带上了etag,那么资源下次请求时就会把值加入到头if-none-match中,服务端可以对比这个值,确定资源是否变化,未变化则返回304

另一个是last-modified / if-modified-since:服务器端返回资源时,如果头部带上了 last-modified,那么资源下次请求时就会把值加⼊到请求头 if-modified-since中,服务器可以对⽐这个值,确定资源是否发⽣变化,如果没有发⽣变化,则返回 304

400

400的提示就是客户端错误,但是并不是那么简单,有的时候可能是前端的请求方法或者参数写错了,也有可能是后端的问题

401

一般未登录应该返回401,所以我们需要在axios中设置响应拦截器,当状态码为401时跳转到登录页面;

axios.interceptors.response.use(function (response) { 
    if(response?.data?.code===401){
        window.location.href = '//www.baidu.com'
    }
    return response;
});

403 404 405

403是禁止访问,一般由资源服务器设置,一般是为了安全而设置的

404是未找到资源

405前端发的请求方法与后端需要的不一致,比如后端需要POST请求而前端用的GET请求,这个时候后端可能会返回405当然也有可能返回400

5xx

如果遇到5xx错误不用问,肯定是服务端的问题了

总结

这些状态码可能在面试过程中会经常考到,但是也不需要死记硬背;只要先记住某一类,那么后面具体的状态码就好记多了