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'
        })
    })
}
相关推荐
李姆斯3 小时前
为啥Agent在coding表现这么好,但是在别的领域就是差的不少?
前端·agent·ai编程
鱼与宇5 小时前
前端Web(html+css+js+vue3)
前端
孙克旭_6 小时前
Docker 镜像构建|Vue+SpringBoot+Go 多语言项目 Dockerfile 案例
linux·运维·vue.js·spring boot·docker·dockerfile
雪芽蓝域zzs7 小时前
(六)打包优化 + Nginx 部署完整配置 + 项目收尾
前端·vue.js
研☆香7 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
东风破_7 小时前
JWT 1:从一个登录请求开始,理解 React 项目里的 API 层与 Mock
前端·后端
东风破_8 小时前
JWT 3:为什么 Token 要放进 Authorization?Axios 拦截器到底解决了什么?
前端·后端
东风破_8 小时前
JWT 5:路由守卫是什么?把整个 JWT 登录鉴权流程串起来
前端·后端
东风破_8 小时前
JWT 2:HTTP 是无状态的,为什么登录成功后还要给 Token?
前端·后端
东风破_8 小时前
JWT 4:Zustand 到底解决了什么?为什么登录状态要放进 Store?
前端·后端