vue网络请求

post网络请求

复制代码
import axios from 'axios'
import {ElMessage, ElLoading} from "element-plus"
import { nextTick } from "vue"
import JSONbig from 'json-bigint'
import { userToken } from "@/constants/Constant.js";

const defaultConfig = {
    baseURL: import.meta.env.VITE_BASE_URL,
    timeout: 2 * 60 * 1000,
    headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
    },
    transitional: {
        forcedJSONParsing: false
    },
    transformResponse: (data) => {
        try {
            return JSONbig.parse(data)
        } catch (err) {
            return data
        }
    }
};

const instance = axios.create({
    ...defaultConfig,
})

instance.interceptors.request.use((config) => {
    // 实时动态设置登陆用户token
    config.headers.Authorization = userToken();
    return config;
});

export async function postReq(path, param, config, success, fail) {
    return await instance.post(
        path,
        param || {},
        config,
    ).then(success, fail)
}

/**
 * 
 * @param {*} callback 只返回成功后的数据
 */
export function basePostReq(path, param, callback) {
    sendPostReq(path, param, null, true, true, true, callback)
}

/**
 * 
 * @param {*} isShowLoading 是否显示loading
 * @param {*} isShowError 是否显示报错
 * @param {*} isOnlyData 是否只返回有用的数据
 * @param {*} callback 只返回成功后的数据
 */
export function sendPostReq(path, param, config, isShowLoading, isShowError, isOnlyData, callback) {
    var loading = null
    if (isShowLoading) {
        loading = ElLoading.service({
            lock: true,
            text: '请稍等...',  
            background: 'rgba(0, 0, 0, 0.7)'
        })
    }
    postReq(path, param, config, (res)=> {
        if (loading) {
            nextTick(() => {
                loading.close()
            })
        }
        if (res.data instanceof Blob) {
            if (res.data.type == 'application/json') {
                const reader = new FileReader()
                reader.readAsText(res.data, 'utf-8')
                reader.onload = function() {
                    try {
                        const blobData = JSON.parse(reader.result)
                        if (!blobData.code || blobData.code != 200) {
                            if (isShowError) {
                                ElMessage({
                                    showClose: true,
                                    message: blobData.message || '请求失败',
                                    duration: 0,
                                    type: 'error'
                                })
                            }
                            return
                        }
                        if (isOnlyData && blobData) {
                            if (callback) {
                                callback(blobData.data)
                            }
                        } else {
                            if (callback) {
                                callback(blobData)
                            }
                        }
                    } catch (e) {
                        ElMessage({
                            showClose: true,
                            message: "json解析失败:" + e.toString(),
                            duration: 0,
                            type: 'error'
                        })
                    }
                }
            } else {
                if (callback) {
                    callback(res.data)
                }
            }
            return
        }
        if (!res.data.code || res.data.code != 200) {
            if (isShowError) {
                ElMessage({
                    showClose: true,
                    message: res.data.message || '请求失败',
                    duration: 0,
                    type: 'error'
                })
            }
            return
        }
        if (isOnlyData && res.data) {
            if (callback) {
                callback(res.data.data)
            }
        } else {
            if (callback) {
                callback(res.data)
            }
        }
    }, (err)=> {
        if (loading) {
            nextTick(() => {
                loading.close()
            })
        }
        ElMessage({
            showClose: true,
            message: err.code +', ' + err.message,
            duration: 0,
            type: 'error'
        })
    })
}
相关推荐
二哈喇子!4 小时前
BOM模型
开发语言·前端·javascript·bom
二哈喇子!4 小时前
Vue2 监听器 watcher
前端·javascript·vue.js
yanyu-yaya5 小时前
前端面试题
前端·面试·前端框架
二哈喇子!5 小时前
使用NVM下载Node.js管理多版本
前端·npm·node.js
GGGG寄了5 小时前
HTML——文本标签
开发语言·前端·html
2501_944521596 小时前
Flutter for OpenHarmony 微动漫App实战:推荐动漫实现
android·开发语言·前端·javascript·flutter·ecmascript
Amumu121387 小时前
Vue核心(三)
前端·javascript·vue.js
CoCo的编程之路7 小时前
2026 前端效能革命:如何利用智能助手实现“光速”页面构建?深度横评
前端·人工智能·ai编程·comate·智能编程助手·文心快码baiducomate
RFCEO7 小时前
HTML编程 课程五、:HTML5 新增语义化标签
前端·html·html5·跨平台·语义化标签·可生成安卓/ios·html最新版本
2501_944521597 小时前
Flutter for OpenHarmony 微动漫App实战:图片加载实现
android·开发语言·前端·javascript·flutter·php