博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue中axios的封装
阅读量:6259 次
发布时间:2019-06-22

本文共 3086 字,大约阅读时间需要 10 分钟。

前言

  在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.apiPrefixexport 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);            })        }    }};复制代码

转载于:https://juejin.im/post/5cad96a3e51d456e5a0728b7

你可能感兴趣的文章
MaxCompute SQL原理解析及性能调优
查看>>
vue中慎用style的scoped属性
查看>>
深度学习在股票市场的应用
查看>>
redis源码分析之事务Transaction(下)
查看>>
【273天】我爱刷题系列(32)
查看>>
Hystrix基础入门和特性讲解
查看>>
webpack-dev-server模块
查看>>
解决brew默认安装iamgemagick7导致wand库运行错误问题
查看>>
进入页面跳转到指定锚点
查看>>
如何根据protobuf来Mock后台返回的数据
查看>>
JavaScript 运算符规则与隐式类型转换详解
查看>>
网站攻击中的csrf和xss
查看>>
(CZ深入浅出Java基础)反射
查看>>
图像颜色提取
查看>>
20170626-Promise的实现
查看>>
jQuery webcam plugin调用摄像头
查看>>
Vue入门笔记
查看>>
bash脚本case与函数
查看>>
我的学习计划
查看>>
理解 Go 语言中的方法和接收者
查看>>