axios的简单封装

2,696 阅读2分钟

前言

最近根据业务要求自己构建了一个vue项目,与后台数据交互用的是axios。axios是基于promise的http库,可以拦截和响应请求,客户端防御XSRF等。

安装axios

npm install axios;

文件划分

在src下新建一个api文件夹,然后在里面新建一个http.js文件。http.js文件用来封装axios

http.js
import axios from 'axios';

//http request 拦截器
axios.interceptors.request.use(
    config =>{
        if(config.method!='get'){
            config.data = JSON.stringify(config.data);
        }
        config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
        
        <!--设置token可以判断是否处于登录状态,每次请求的时候将token带上-->
        let token = window.sessionStorage.getItem("TOKEN");
        if(token){
            config.params = {'token':token}
        }
        return config;
    },
    error =>{
        return Promise.reject(error)
    }
)

注意利用axios的post请求传递数据时:axios.post(url,{xxx:xxx}).then会发生参数错误,得将对象形式转换成字符串键值对形式。

响应拦截器

响应拦截器一般是对状态码进行管理,对不同的状态码返回不同的操作

/ http response 拦截器
axios.interceptors.response.use(
    response =>{
        //自己配置一些状态码
        // if(response.data.errCode == 2){

        // }
        return response;
    },
    error =>{
    //与后台人员协商配置
        return Promise.reject(error)
    }
)

封装get,post方法(put,patch等也差不多)

先说一下get请求的传参方式与post请求传参方式的区别,便于理解后面get,post方法的封装。

get请求
1,可以直接拼在url上
axios.get('/user?id=111')
.then(res=>{
    console.log(res)
})
.catch(err=>{
    console.log(err)
})
2,axios把以键值对的形式放入params对象中
axios.get('/user',{
    params:{
        id:111
    }
})
.then(res=>{
    console.log(res)
})
.catch(err=>{
    console.log(err)
})
post请求:直接将参数放在一个对象当中
axios.post('/user'{
    id:111
})
.then(res=>{
    console.log(res)
})
.catch(err=>{
    console.log(err)
})

正题来了

* 封装get方法
 * @param url 
 * @param params 
 * @returns {Promise}
 */
 export function get(url,params={}){
     return new Promise((resolve,reject)=>{
        axios.get(url,{
            params:params
        })
        .then(res=>{
            resolve(res.data)
        })
        .catch(err=>{
            reject(err)
        })
     })
 }
 
 /**
 * 封装post请求
 * @param url
 * @param params
 * @returns {Promise}
 */
 export function post(url,params = {}){
     return new Promise((resolve,reject)=>{
         axios.post(url,params)
         .then(res=>{
            resolve(res.data)
         })
         .catch(err=>{
            reject(err)
         })
     })
 }

在main.js中引入

import axios from 'axios'
import {get,post} from './api/http'
//定义全局变量
Vue.prototype.$get = get;
Vue.prototype.$post = post;

在组件中使用

let param={}
this.$get('queryParam',param)
    .then(res=>{
        console.log(res)
    })
post方法一样

扩展(这些是后续的一些扩展)

环境配置

项目环境会有开发,测试,生产三个环境。可以通过node的环境变量来匹配默认的接口url前缀。(这个其实我也不懂为啥???),可以通过axios.defaults.baseURL设置axios的默认请求地址。

// 环境的切换
if (process.env.NODE_ENV == 'development') {
	axios.defaults.baseURL = 'https://www.baidu.com';}
else if (process.env.NODE_ENV == 'debug') {
	axios.defaults.baseURL = 'https://www.ceshi.com';
}
else if (process.env.NODE_ENV == 'production') {
	axios.defaults.baseURL = 'https://www.production.com';
}

设置请求超时

axios.default.timeout = 10000;