美文网首页
axios请求与响应拦截器(依赖koa2项目)

axios请求与响应拦截器(依赖koa2项目)

作者: 似朝朝我心 | 来源:发表于2021-05-13 15:47 被阅读0次

拦截器是什么?
请求拦截器:就是在我们发起每一个axios请求之前,统一进行对请求前的一个拦截。
响应拦截器:在我们作出响应的时候,在响应之前就提前作出统一的拦截操作。
axios请求拦截器:


响应拦截器:

代码:

            // 添加请求拦截器
            axios.interceptors.request.use(function (config) {
                // 在发送请求之前做些什么
                console.log('1')
                return config;
              }, function (error) {
                // 对请求错误做些什么
                return Promise.reject(error);
              });
            
            // 添加响应拦截器
            axios.interceptors.response.use(function (response) {
                // 对响应数据做点什么
                console.log('2')
                return response;
              }, function (error) {
                // 对响应错误做点什么
                return Promise.reject(error);
              });

效果:



那这种拦截器的需求到底是什么呢?多此一举?其实不然,它可以用来控制实现动态loading加载的效果,让我们向服务器请求数据的时候,让页面转圈圈,数据回来后(响应),让页面的动态loading消失,拦截器控制的就是这种需求,它可以让你在这两个过程充分发挥。

此外还可以在请求拦截器中的头信息添加携带数据,最常用的是令牌token、在响应拦截器中添加全局的错误处理。

具体案例实现:
点击按钮,数据没回来之前,显示加载,数据回来后,加载消失。


请求路径出错时,响应404的页面信息(这里需要故意写错请求路径,测试效果)。


携带令牌

案例前端代码:koa2+vue+axios

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="./javascripts/vue.js" type="text/javascript" charset="utf-8"></script>
        <link rel="stylesheet" type="text/css" href="./stylesheets/style.css" />
        <script src="./javascripts/axios.min.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <div v-show="control" style="height: 100px;width: 200px;">
                <img width="100%" height="100%" src="images/1.gif" >
            </div>
            <div style="height: 200px;width: 200px;"  v-if="show404">
                <img width="100%" height="100%" src="images/2.gif" >
            </div>
            <button type="button" @click="handleClick">点击</button>
        </div>
        <script type="text/javascript"> 
            const app = new Vue({
                data() {
                    return {
                        control: false,
                        show404:false
                    }
                },
                methods:{
                    handleClick(){
                        let that = this //涉及请求的都需要更改指针
                        //this.control = true
                        // 添加请求拦截器
                        axios.interceptors.request.use(function (config) {
                            // 在发送请求之前做些什么
                            that.control = true
                            config.headers.token = 'qinfubin' //发起请求时,携带令牌给后端,后端拿到令牌后,就可以判断当前用户的身份和权限
                            return config;
                          }, function (error) {
                            // 对请求错误做些什么
                            return Promise.reject(error);
                          });
                        
                        // 添加响应拦截器
                        axios.interceptors.response.use(function (response) {
                            // 对响应数据做点什么
                            setTimeout(()=>{
                                that.control = false
                            },2000)
                            
                            return response;
                          }, function (error) {
                            // 对响应错误做点什么
                            if(error.response.status == 404) {
                                that.show404 = true
                            }
                            return Promise.reject(error);
                          });
                        
                        
                        axios.get('/list',{
                            params:{
                                name:'Bom'
                            }
                        })
                        .then((res) => {
                            console.log(res)
                        })
                        .catch((err) => {
                            console.log(err)
                        })
                    }
                }
            }).$mount("#app")
        </script>
        
    </body>
</html>

后端代码:

router.get('/list', async (ctx, next) => {
    console.log(ctx.request.query)
    ctx.body = {
        errCode:0,
        errMsg:"ok",
        list:[
            {"userName":"覃放","age":22}
        ]
    }
})

总结:

相关文章

网友评论

      本文标题:axios请求与响应拦截器(依赖koa2项目)

      本文链接:https://www.haomeiwen.com/subject/hptxjltx.html