基于axios-1.3.3版本实现
index.ts
import axios from 'axios'
import type { AxiosInstance } from 'axios'
import type { YORequesInterceptors, YORequestConfig } from './type'
class YORequest {
instance: AxiosInstance
interceptors?: YORequesInterceptors
constructor(config: YORequestConfig) {
this.instance = axios.create(config)
this.interceptors = config.interceptors
this.instance.interceptors.request.use(
this.interceptors?.requestInterceptor,
this.interceptors?.requestInterceptorCath
)
this.instance.interceptors.response.use(
this.interceptors?.responseInterceptor,
this.interceptors?.responseInterceptorCath
)
this.instance.interceptors.request.use(
config => {
return config
},
error => {
return Promise.reject(error)
}
)
this.instance.interceptors.response.use(
config => {
return config
},
error => {
return Promise.reject(error)
}
)
}
request<T>(config: YORequestConfig): Promise<{
code: number
data: T
msg: string
}> {
return new Promise(resolve => {
if (config.interceptorsToOnce?.requestInterceptor) {
config = config.interceptorsToOnce.requestInterceptor(config)
}
this.instance
.request(config)
.then(res => {
if (config.interceptorsToOnce?.responseInterceptor) {
res = config.interceptorsToOnce.responseInterceptor(res)
}
resolve(res.data)
})
.catch(err => {
resolve(err.response ? err.response.data : err)
})
})
}
get<T>(config: YORequestConfig): Promise<{
code: number
data: T
msg: string
}> {
return this.request<T>({ ...config, method: 'get' })
}
post<T>(config: YORequestConfig): Promise<{
code: number
data: T
msg: string
}> {
return this.request<T>({ ...config, method: 'post' })
}
delete<T>(config: YORequestConfig): Promise<{
code: number
data: T
msg: string
}> {
return this.request<T>({ ...config, method: 'delete' })
}
put<T>(config: YORequestConfig): Promise<{
code: number
data: T
msg: string
}> {
return this.request<T>({ ...config, method: 'put' })
}
patch<T>(config: YORequestConfig): Promise<{
code: number
data: T
msg: string
}> {
return this.request<T>({ ...config, method: 'patch' })
}
}
export default YORequest
type.ts
import type {
AxiosResponse,
AxiosRequestConfig,
InternalAxiosRequestConfig,
} from 'axios'
export interface YORequesInterceptors {
requestInterceptor?: (
config: InternalAxiosRequestConfig
) => InternalAxiosRequestConfig
requestInterceptorCath?: (error: any) => any
responseInterceptor?: (res: AxiosResponse) => AxiosResponse
responseInterceptorCath?: (error: any) => any
}
export interface YORequesInterceptorsToOnce {
requestInterceptor?: (config: AxiosRequestConfig) => AxiosRequestConfig
responseInterceptor?: (res: AxiosResponse) => AxiosResponse
}
export interface YORequestConfig extends AxiosRequestConfig {
interceptors?: YORequesInterceptors
interceptorsToOnce?: YORequesInterceptorsToOnce
}