Files

60 lines
1.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 统一请求封装(基于 Nuxt 内置 ofetch
*
* 与 dashboard 后端约定响应格式:{ code, msg, data }
* - code = 1:成功
* - code = 0:业务错误
* - code = 2:无数据
*/
import { resolveAssetUrls } from '~/utils/resolveAssetUrl';
export interface ApiResponse<T = unknown> {
code: number;
msg: string;
data: T | null;
}
export class ApiError extends Error {
code: number;
constructor(msg: string, code: number) {
super(msg);
this.code = code;
}
}
export function useRequest() {
const config = useRuntimeConfig();
const baseURL = config.public.apiBaseUrl as string;
async function request<T = unknown>(url: string, options?: Parameters<typeof $fetch>[1]): Promise<T | null> {
const res = await $fetch<ApiResponse<T>>(url, {
baseURL,
...options
});
if (res.code === 0) {
throw new ApiError(res.msg || '请求失败', res.code);
}
// code = 2(无数据)时 data 为 null,正常返回
// 统一解析 *_url / *_path 字段中的相对路径(如 /uploads/...)为完整资源地址
return resolveAssetUrls(res.data);
}
function get<T = unknown>(url: string, params?: Record<string, unknown>) {
return request<T>(url, { method: 'GET', params });
}
function post<T = unknown>(url: string, body?: Record<string, unknown>) {
return request<T>(url, { method: 'POST', body });
}
/** POST multipart/form-data(文件上传;ofetch 自动设置 boundary */
function postForm<T = unknown>(url: string, body: FormData) {
return request<T>(url, { method: 'POST', body });
}
return { request, get, post, postForm };
}