Vue中axios的封装

765 阅读2分钟

前言

  在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSRF等。

  下面就是前端小白对于axios的简单封装。

1.安装

npm install axios; // 安装axios

2.引入

  一般我会在项目的src目录中,新建一个api文件夹,然后在里面新建一个api.js和一个request.js文件。api.js用来统一管理我们的接口,request.js文件用来封装axios。   

3.封装

request.js中写对于axios的封装。首先引入axios、qs依赖,引入main.js主要是用于后面对接口进行统一处理,比如调接口的时候,显示loading等。

import axios from 'axios'
import qs from 'qs'
import ServerMixin from '@/mixin/ServerMixin'
export const doExec = (url, params, contentType, methods) => {
    let pstr = qs.stringify(params, { arrayFormat: 'brackets' })
    return axios({
            //设置请求的接口地址
            url: (methods && methods.toUpperCase()) !== 'GET' ? url : `${url}?${pstr}`,
            //params是添加到url的请求字符串中的,用于get请求
            params: null,
            //data是添加到请求体(body)中的, 用于post请求。java后台用qs转
            data: (contentType && contentType.toUpperCase()) === 'JSON' ? params : qs.stringify(params),
            //请求方法,默认GET
            method: methods || 'POST',
            //这里的请求头与后台商量设置
            headers: {
                // 'x-auth-token': getUserInfo() == undefined ? "" : getUserInfo().token
            }
        })
        .then((res) => {
            return res.data
        })
}

在api.js中引入doExec方法。

import { doExec } from '@/api/request'

const apiPrefix = window.apiPrefix

export const api = {
    // 用户
    user: {
        // 登录
        login(opts) {
            return doExec(`${apiPrefix}user/login`, opts)
        },
    }
}

axios实例创建好之后,开始使用request拦截器对axios请求配置做统一处理,具体如下:

//设置超时时间
axios.defaults.timeout = 10000;
//添加请求拦截器
axios.interceptors.request.use(config => {
    //此处可以自行设置Loadding
    return config
}, error => {
    return Promise.reject(error)
})

//添加响应拦截器
axios.interceptors.response.use(response => {
    if (response.data.code == 4) {
        ServerMixin.Event.$emit('login')
    }

    return response
}, error => {
    console.log(error.response.status)
    if (error.response !== undefined) {
        switch (error.response.status) {
            case 404:
                if (window.sessionStorage.getItem('out') === null) {
                    window.sessionStorage.setItem('out', 1)
                    MessageBox.confirm('登陆超时!', '提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
                        store.dispatch("logout")
                    }).catch(action => {
                        console.log(action)
                    })
                }
                //...其他状态码根据业务需求变更。
                break
            default:
                MessageBox.alert(`连接错误${error.response.status}`)
        }
        return Promise.resolve(error.response)
    }
    return Promise.reject(error)
})

4.调用

现在只需要在业务模块直接调用$api,调用对应方法即可:

export default {
    data() {
        return {
            form: {
                account: "admin",
                password: "admin"
            }
        };
    },
    methods: {
        login() {
            this.$api.user.login(this.form).then((res) => {
                console.log(res);
            })
        }
    }
};