axios二次封装

request.js

// http.js
import axios from 'axios'
// 引入路由
import router from '../router/index'
// 引入vuex
import store from '../store/index';
// 引入提示组件
import { MessageBox, Message } from 'element-ui'
// 引入api
import apiList from './apiList'
// 引入QS
import Qs from 'qs'

/**
 * @param {String} httpUrl [baseUrl] 
**/
let httpUrl = ' dmin'//(测试环境)
// 配置请求
axios.defaults.baseURL = httpUrl // 配置请求地址
axios.defaults.withCredentials = false
axios.defaults.timeout = 30000; // 超时终止请求
// 请求拦截器
axios.interceptors.request.use(config => {
    console.log(config)

    // 每次发送请求之前判断vuex中是否存在token        
    // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 
    // 请求消息头
    let Authorization = 'Authorization'
    // 获取token
    let token = store.state.token;    
    if(token){
        config.headers[Authorization] = token
    }else{
        config.headers[Authorization] = window.sessionStorage.getItem('token')
    }
    if(config.method == 'post'){
        config.data = Qs.stringify(config.data)
    }
    return config
},err => {
    return Promise.error(error);
})

// 根据不同的状态码,生成不同的提示信息
const showStatus = (status) => {
    let message = ""
    // 这一坨代码可以使用策略模式进行优化
    switch(status){
        case 400:
            message = "请求错误(400)"
            break
        case 401:
            message = "未授权,请重新登录(401)"
            break
        case 403:
            message = "拒绝访问(403)"
            break
        case 404:
            message = "请求出错(404)"
            break
        case 408:
            message = "请求超时(408)"
            break
        case 500:
            message = "服务器错误(500)"
            break
        case 501:
            message = "服务未实现(501)"
            break
        case 502:
            message = "网络错误(502)"
            break
        case 503:
            message = "服务不可用(503)"
            break
        case 504:
            message = "网络超时(504)"
            break
        case 505:
            message = "HTTP版本不受支持(505)"
            break
        default:
            message = `连接出错(${status})!`
    }
    return `${message},请检查网络或联系管理员!`
}

// 响应拦截器
axios.interceptors.response.use(response => {
    if(response.data.code == 1001){
        MessageBox.confirm("登录令牌失效,请重新登录",'提示' + response.data.code,{
            confirmButtonText:'确定',
            showCancelButton:false,
            type:'warning',
            customClass:'warningTip',
            closeOnClickModal:false
        }).then(() => {
            router.push('/login')
        }).catch(() => {
        });
    }else if(response.data.code > 1001 || response.data.code < 1000){
        let msg = showStatus(response.data.code)
        Message.error(msg)
    }
    return Promise.resolve(response.data);
},error => {//这里对 error 预期结果是包含具体错误信息和状态码
    if(error && error.response && error.response.status){
        MessageBox.confirm(error.response.data.message,'提示' + error.response.data.code,{
            confirmButtonText:'确定',
            showCancelButton:false,
            type:'warning',
            customClass:'warningTip',
            closeOnClickModal:false
        }).then(() => {
        }).catch(() => {
        });
    }
    return Promise.reject(error)
})

/**
 * @param {Object} hrrpSever [保存请求的方法]
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
**/
// 以下是封装方法:
var httpSever = {};
for(let item in apiList){
    httpSever[item] = function(params){
        let {method,url} = apiList[item];
        let data = (method == 'get' || method == "delete") ? {params} : (method == 'post' || method == "put" || method == "patch") ? params : {}
        return new Promise((resolve, reject) => {
            axios[method](url,data).then(res => {
                if(res){
                    resolve(res);
                }
            }).catch(err => {
                reject(err);
            })
        })
    }
}
/**
 * 使用方法:
 * 组件引入httpSever然后httpSever打点调用方法名的形式使用
**/
export default httpSever

apiList.js

// 引入模块
import moduleA from './api/moduleA'
import moduleB from './api/moduleB'
const modules = {
	moduleA,
	moduleB
}
function parseUrl(){
	let res = {}
	for(let key in modules){
		let item = modules[key]
		for(let k in item){
            res[k] = item[k]
		}
	}
	return res
}
export default parseUrl()

./api/moduleA.js

/**
 * @param {string} key [发送请求的函数名称]
 * @param {Object} value [保存请求的方法和路径]
**/
let moduleA = {
    productList:{
        method:'post',
        url:"/ProductManage/list"
    },
    MerchantManageList:{
        method:'post',
        url:"/MerchantManage/list"
    },
    D:{
        method:'delete',
        url:"/d"
    }
}
export default moduleA;

使用方法:
组件引入httpSever然后httpSever打点调用方法名的形式使用

注意:该方法同时封装了get\delete\post\put\patch请求
有需要的可以使用

好的,我可以为你提供关于Axios二次封装的一些建议。在进行二次封装之前,你需要先确保已经安装了Axios。以下是一个基本的Axios二次封装示例: ```javascript import axios from 'axios'; // 创建一个Axios实例 const instance = axios.create({ baseURL: 'http://api.example.com', // 设置请求的基本URL timeout: 5000 // 设置请求超时时间 }); // 请求拦截器 instance.interceptors.request.use( config => { // 在请求发送之前做一些处理,比如添加token等 return config; }, error => { // 请求错误时的处理 return Promise.reject(error); } ); // 响应拦截器 instance.interceptors.response.use( response => { // 对响应数据进行处理 return response.data; }, error => { // 响应错误时的处理 return Promise.reject(error); } ); // 封装GET请求 export function get(url, params) { return instance.get(url, { params }); } // 封装POST请求 export function post(url, data) { return instance.post(url, data); } // 其他HTTP方法的封装类似,如put、delete等 export default instance; ``` 上述示例中,我们创建了一个基于Axios的实例,然后通过拦截器对请求和响应进行处理。你可以根据实际需求在拦截器中添加自定义逻辑,比如统一处理错误信息、添加请求头等。 封装的get和post函数可以直接调用,例如: ```javascript import request from './axios'; // 上述代码放在axios.js文件中 request.get('/api/users', { params: { page: 1 } }) .then(response => { console.log(response); }) .catch(error => { console.error(error); }); ``` 这样你就可以通过调用封装好的函数来发起请求,而无需每次都编写重复的代码。希望这对你有所帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值