美文网首页
vue api封装

vue api封装

作者: 不会写代码的机器人 | 来源:发表于2021-04-13 11:28 被阅读0次

    创建api文件夹,文件夹下创建 api.jshttp.js
    安装axiosqs
    npm install axios --save
    npm i qs
    在main.js 头部引入

    import api from './api/api'
    Vue.prototype.$api = api;
    
    //http.js
    
    import axios from 'axios'; // 引入axios
    import QS from 'qs'; // 引入qs模块,用来序列化post类型的数据,后面会提到
    axios.defaults.withCredentials = true; //发送cookie
    if (process.env.NODE_ENV == 'development') {
        // if (window.location.origin == 'http://z.tech-chance.com') {
        //     axios.defaults.baseURL = 'http://xbh.tech-chance.com';
        // }
        // if (window.location.origin == 'http://n.tech-chance.com') {
        //     axios.defaults.baseURL = 'http://n.tech-chance.com'
        // }
        // axios.defaults.baseURL = 'http://n.xyplove.com';
        axios.defaults.baseURL = 'http://n.75521.com'
        // axios.defaults.baseURL = 'http://lsh.75521.com'
    
    } else if (process.env.NODE_ENV == 'production') {
        axios.defaults.baseURL = window.location.origin
    }
    // axios.defaults.baseURL = 'http://192.168.100.73'
    // axios.defaults.baseURL = 'http://n.tech-chance.com'
    axios.defaults.timeout = 10000;
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //post请求头的设置
    
    // 响应拦截器
    
    axios.interceptors.response.use(
        response => {
            // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据     
            // 否则的话抛出错误
            // let token = window.localStorage.getItem("accessToken")
            // if (token) {
            //     response.headers.accessToken = token; //将token放到请求头发送给服务器
            //     return response;
            //     //这里经常搭配token使用,将token值配置到tokenkey中,将tokenkey放在请求头中
            //     // config.headers['accessToken'] = Token;
            // }else{
            //     console.log(response)
            //     response.config.headers.accessToken = 123;
            // }
            if (response.status === 200) {
                return Promise.resolve(response);
            } else {
                return Promise.reject(response);
            }
    
    
        },
        // 服务器状态码不是2开头的的情况
        // 这里可以跟你们的后台开发人员协商好统一的错误状态码    
        // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
        // 下面列举几个常见的操作,其他需求可自行扩展
        error => {
            if (error.response.status) {
                switch (error.response.status) {
                    // 401: 未登录
                    // 未登录则跳转登录页面,并携带当前页面的路径
                    // 在登录成功后返回当前页面,这一步需要在登录页操作。                
                    case 4300:
                        router.replace({
                            path: '/login',
                            query: {
                                redirect: router.currentRoute.fullPath
                            }
                        });
                        break;
                        // 403 token过期
                        // 登录过期对用户进行提示
                        // 清除本地token和清空vuex中token对象
                        // 跳转登录页面                
                    case 403:
                        //  Toast({
                        //     message: '登录过期,请重新登录',
                        //     duration: 1000,
                        //     forbidClick: true
                        // });
                        // 清除token
                        localStorage.removeItem('token');
                        store.commit('loginSuccess', null);
                        // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 
                        setTimeout(() => {
                            router.replace({
                                path: '/login',
                                query: {
                                    redirect: router.currentRoute.fullPath
                                }
                            });
                        }, 1000);
                        break;
                        // 404请求不存在
                    case 404:
                        Toast({
                            message: '网络请求不存在',
                            duration: 1500,
                            forbidClick: true
                        });
                        break;
                        // 其他错误,直接抛出错误提示
                    default:
                        Toast({
                            message: error.response.data.message,
                            duration: 1500,
                            forbidClick: true
                        });
                }
                return Promise.reject(error.response);
            }
        }
    )
    /**
     * get方法,对应get请求
     * @param {String} url [请求的url地址]
     * @param {Object} params [请求时携带的参数]
     */
    export function get(url, params) {
        return new Promise((resolve, reject) => {
            axios.get(url, {
                params: params
            }).then(res => {
                resolve(res.data);
            }).catch(err => {
                reject(err.data)
            })
        });
    }
    /** 
     * post方法,对应post请求 
     * @param {String} url [请求的url地址] 
     * @param {Object} params [请求时携带的参数] 
     * @param {Object} head_conf [修改请求头] 
     */
    export function post(url, params, head_conf) {
        return new Promise((resolve, reject) => {
            if (head_conf != undefined) { //文件上传获取url
                console.log("上传文件")
                axios.post(url, params, head_conf)
                    .then(res => {
                        resolve(res.data);
                    })
                    .catch(err => {
                        reject(err.data)
                    })
            } else {
                axios.post(url, QS.stringify(params))
                    .then(res => {
                        resolve(res.data);
                    })
                    .catch(err => {
                        reject(err.data)
                    })
            }
    
        });
    }
    
    //api.js
    import {
        get,
        post
    } from './http';
    export default {
        getChargeProduct(data) { //获取充值商品
            return post('url', data)
        },
        getUserInfo(data) { //通过手机号登录
            return post('url', data)
        },
    }
    

    相关文章

      网友评论

          本文标题:vue api封装

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