重构项目,方便开发
This commit is contained in:
107
frontend-vue/src/shared/api/http.ts
Normal file
107
frontend-vue/src/shared/api/http.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
import axios, {
|
||||
AxiosError,
|
||||
type AxiosInstance,
|
||||
type AxiosRequestConfig,
|
||||
type AxiosResponse,
|
||||
type InternalAxiosRequestConfig,
|
||||
} from 'axios'
|
||||
|
||||
export interface ApiSuccess<T> {
|
||||
success: true
|
||||
msg?: string
|
||||
data?: T
|
||||
}
|
||||
|
||||
export interface ApiFailure {
|
||||
success: false
|
||||
error?: string
|
||||
}
|
||||
|
||||
export type ApiResponse<T> = ApiSuccess<T> | ApiFailure
|
||||
export type RequestOptions<D = unknown> = AxiosRequestConfig<D>
|
||||
|
||||
function extractErrorMessage(error: unknown) {
|
||||
if (error instanceof AxiosError) {
|
||||
const data = error.response?.data
|
||||
|
||||
if (data && typeof data === 'object' && 'error' in data) {
|
||||
return String(data.error)
|
||||
}
|
||||
|
||||
if (typeof data === 'string' && data.trim()) {
|
||||
return data
|
||||
}
|
||||
|
||||
return error.message || '请求失败'
|
||||
}
|
||||
|
||||
return error instanceof Error ? error.message : '请求失败'
|
||||
}
|
||||
|
||||
function createHttpClient(): AxiosInstance {
|
||||
const instance = axios.create({
|
||||
withCredentials: true,
|
||||
timeout: 30000,
|
||||
headers: {
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
},
|
||||
})
|
||||
|
||||
instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
|
||||
return config
|
||||
})
|
||||
|
||||
instance.interceptors.response.use(
|
||||
(response: AxiosResponse) => response,
|
||||
(error: unknown) => Promise.reject(new Error(extractErrorMessage(error))),
|
||||
)
|
||||
|
||||
return instance
|
||||
}
|
||||
|
||||
export const http = createHttpClient()
|
||||
|
||||
export async function request<T = unknown, D = unknown>(config: RequestOptions<D>): Promise<T> {
|
||||
const response = await http.request<T, AxiosResponse<T>, D>(config)
|
||||
return response.data
|
||||
}
|
||||
|
||||
export function get<T = unknown>(url: string, config?: RequestOptions) {
|
||||
return request<T>({
|
||||
url,
|
||||
method: 'GET',
|
||||
...config,
|
||||
})
|
||||
}
|
||||
|
||||
export function post<T = unknown, D = unknown>(url: string, data?: D, config?: RequestOptions<D>) {
|
||||
return request<T, D>({
|
||||
url,
|
||||
method: 'POST',
|
||||
data,
|
||||
...config,
|
||||
})
|
||||
}
|
||||
|
||||
export function put<T = unknown, D = unknown>(url: string, data?: D, config?: RequestOptions<D>) {
|
||||
return request<T, D>({
|
||||
url,
|
||||
method: 'PUT',
|
||||
data,
|
||||
...config,
|
||||
})
|
||||
}
|
||||
|
||||
export function del<T = unknown>(url: string, config?: RequestOptions) {
|
||||
return request<T>({
|
||||
url,
|
||||
method: 'DELETE',
|
||||
...config,
|
||||
})
|
||||
}
|
||||
|
||||
export const requestJson = request
|
||||
export const requestGetJson = get
|
||||
export const requestPostJson = post
|
||||
export const requestPutJson = put
|
||||
export const requestDeleteJson = del
|
||||
Reference in New Issue
Block a user