typescript项目中封装axios(二)

本例用于axios在ts项目中封装,主要涉及到get。post。delete、put等多种场景。本例采用vue3+ts+vite故引入了一点vite语法和element-plus组件库的插件。上一篇文章中虽然对axios做了基础封装,但是没有考虑到对二进制文件上传等场景。故做了简单的完善

1 在项目根目录下新建一个types文件夹,用于存放各种interface和type

export interface ResponseData<T>{
 code:number,
 data?:T,
 message:string
}

export interface loginParams{
    systemCode: string,
    phone: string,
    password: string,
    loginType: string,
} 

export interface httpFunc{

    get<T>(url:string,params?:unknown):Promise<T>
    post<T>(url:string,params?:unknown):Promise<T>
    put<T>(url:string,params?:unknown):Promise<T>
    delete<T>(url:string,params?:unknown):Promise<T>
    upload<T>(url:string,params?:unknown):Promise<T>
    downLoad(url:string):void
    
}

2 封装axios,主要是对拦截器做基础设置

import axios,{AxiosInstance,AxiosRequestConfig,AxiosResponse} from "axios"
import {ResponseData,httpFunc} from "../types"
import { ElMessage } from "element-plus"

let service:AxiosInstance;
service=axios.create({
    baseURL:import.meta.env.MODE==="developement"?"":import.meta.env.VITE_BimDevURL,
    timeout:5000
})
service.interceptors.request.use(
    (config:AxiosRequestConfig)=>{
        return config
    },
    (error:any)=>{
    console.log("请求error",error)
        Promise.reject(error)
    }
)

service.interceptors.response.use(
    (res:AxiosResponse)=>{
        console.log("axios",res)
        if(res.status==200){
            const data:ResponseData=res.data;
            if(data.code==1){
                return data.data
            }else{
                ElMessage({
                    message:data.message,
                    type:"error"
                })
            }
        }else{
            ElMessage({
                message:"程序异常",
                type:"error"
            })
            return Promise.reject(new Error(res.data.message))
        }
    },
    (error:any)=>{
        console.log("error",error)
        let errMsg=error.response.data.message||""
        ElMessage({
            message:errMsg,
            type:"error"
        })
        Promise.reject(new Error(error))
    }
)



3:封装http函数

const http:httpFunc={
   get(url,params){
        return new Promise((resolve, reject) => {
            service.get(url, { params }).then(res => {
                resolve(res.data); //注意这里只能是res.data不能是res
            }).catch(err=>{
                reject(err)
            })
        })
    },
    post(url,params){
        return new Promise((resolve,reject)=>{
            service.post(url, params).then(res => {
                resolve(res.data);
            }).catch(err=>{
                reject(err)
            })
        })
    },
    delete(url,params){
        return new Promise((resolve, reject) => {
            service.get(url, { params }).then(res => {
                resolve(res.data);
            }).catch(err=>{
                reject(err)
            })
        })
    },
    put(url,params){
        return new Promise((resolve,reject)=>{
            service.post(url, params).then(res => {
                resolve(res.data);
            }).catch(err=>{
                reject(err)
            })
        })
    },
    upload(url,file){
        return new Promise((resolve,reject)=>{
            service.post(url,file,{
                headers:{
                    "Content-Type":"mutipart/form-data"
                }
            }).then(res => {
                resolve(res.data);
            }).catch(err=>{
                reject(err)
            })
        })
    },
    downLoad(url){
        const a = document.createElement('a')
        a.href = url
        a.download = getFileNameFromUrl(item)
        document.body.appendChild(a)
        a.click()
        document.body.removeChild(a)
    }
}

export default http

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值