Vue移动端

Vue中简单封装Axios请求

2019-01-17  本文已影响3485人  _牙牙
在日常开发过程中,常见的需要在业务层和数据服务层中抽离一个接口层,来统一管理数据请求和接口。这样做的好处是显而易见的,不再累述。下面就来试试在Vue中进行Axios的封装操作:

1.首先在src文件夹下建立一个文件夹这里取名为servers,在这个文件夹里建立一个文件这里取名为request.js。下面是request.js内容,这里是我对axios的简单的封装。代码很简单,看注释应该很容易看懂,不再另外说明了。

import axios from 'axios';
import QS from 'qs';

//自动切换环境
if (process.env.NODE_ENV == 'development'){
    axios.defaults.baseURL = '/api';
} else if (process.env.NODE_ENV == 'debug'){
    axios.defaults.baseURL = '/api';
} else if (process.env.NODE_ENV == 'production') { 
    axios.defaults.baseURL = 'http://***********/';
}
//设置超时时间
axios.defaults.timeout = 10000;
// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

//对外接口
export function request({method, url, params}){
    if(method == 'Get'){
        return get(url, params);
    }else if(method == 'Post'){
        return post(url, params);
    }
}

// 封装get方法
function get(url, params){
    return new Promise((resolve, reject) =>{
        axios.get(url, params).then(res =>{
            resolve(res.data);
        }).catch(err =>{
            reject(err.data);
        })
    });

}

// 封装post方法
function post(url, params){
    return new Promise((resolve, reject) =>{
        axios.post(url, QS.stringify(params)).then(res =>{
            resolve(res.data);
        }).catch(err =>{
            reject(err.data);
        })
          
    });
}

//请求拦截(请求发出前处理请求)
axios.interceptors.request.use(
    confirm => {
        //将token放入header,这里用Vuex把token放在store中,取出
       const token = store.state.token;
       token && (config.headers.Authorization = token);  
       return config; 
    },
    error =>{
        return Promise.error(error); 
    }

)

// 响应拦截器(处理响应数据)
axios.interceptors.response.use( 
    response => {
        if(response.state === 200){
            return Promise.resolve(response);
        }else{
            //这个地方可以由后台编辑状态码区分不同情况,做不同的逻辑处理
            return Promise.reject(response);
        }
    },
    error => {
        // //请求失败,这个地方可以根据error.response.status统一处理一些界面逻辑,比如status为401未登录,可以进行重定向
        // router.replace({      
        //     path: '/login',      
        //     query: { redirect: router.currentRoute.fullPath } 
        //    });
        return Promise.reject(error.response);  

    }
)

2.然后在servers可以建立多个文件,来分别管理不同模块的API,下面来建立一个testServer.js为例。内容如下:

import {request} from './request'

export default testServer ={
    getTestData(params){
        return request({ 
            methods: 'Get',
            url:'testApi',
            params:params
        })
    }
} 

3.现在只需要在test业务模块直接导入testServer,调用对应方法即可:

<script>
import testServer from '../servers/testServer.js'
   export default {
         methods: {
           getTestData(params){
               testServer.getTestData(params).then(res =>{
                       //处理数据
               }).catch(err =>{
                       //提示错误
               })
           }
       }
   }
</script>
上一篇下一篇

猜你喜欢

热点阅读