// 操作 cookie 的函数 import { getToken } from '@/utils/cookie' // 错误处理函数 import { onRequestError } from '@/error/onRequestError' type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' export type FetchOptions = { method: HttpMethod credentials: 'include' headers?: Record body?: BodyInit } const fetchRequest = async ( url: string, options: FetchOptions ): Promise => { const baseUrl = import.meta.env.VITE_API_BASE_URL const fullUrl = `${baseUrl}${url}` // 在请求头中添加 token const headers = { ...options.headers, Authorization: `Bearer ${getToken()}`, } const response = await fetch(fullUrl, { ...options, headers }) // 处理错误 onRequestError(response) const data: T = await response.json() return data } const fetchGet = async ( url: string, headers?: Record ): Promise => { const options: FetchOptions = { method: 'GET', credentials: 'include', headers: headers, } return await fetchRequest(url, options) } const fetchPost = async ( url: string, body?: Record, headers?: Record ): Promise => { const options: FetchOptions = { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json', ...headers, }, body: JSON.stringify(body), } return await fetchRequest(url, options) } const fetchPut = async ( url: string, body?: Record, headers?: Record ): Promise => { const options: FetchOptions = { method: 'PUT', credentials: 'include', headers: { 'Content-Type': 'application/json', ...headers, }, body: JSON.stringify(body), } return await fetchRequest(url, options) } const fetchDelete = async ( url: string, headers?: Record ): Promise => { const options: FetchOptions = { method: 'DELETE', credentials: 'include', headers: headers, } return await fetchRequest(url, options) } export { fetchGet, fetchPost, fetchPut, fetchDelete }