Files
mp-xieyingeng/assets/scripts/utils/HttpUtil.ts
2026-04-05 13:37:58 +08:00

105 lines
2.9 KiB
TypeScript
Raw 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.
/**
* HTTP 请求工具类
* 封装 XMLHttpRequest支持 GET/POST 请求,支持 JWT 认证
*/
export class HttpUtil {
/** 认证 token */
private static _authToken: string | null = null;
/**
* 设置认证 token
* @param token JWT token
*/
static setAuthToken(token: string | null): void {
HttpUtil._authToken = token;
console.log(`[HttpUtil] Auth token ${token ? '已设置' : '已清除'}`);
}
/**
* 获取认证 token
*/
static getAuthToken(): string | null {
return HttpUtil._authToken;
}
/**
* 发送 GET 请求
* @param url 请求 URL
* @param timeout 超时时间(毫秒),默认 10000
* @returns Promise<Response>
*/
static get<T>(url: string, timeout: number = 10000): Promise<T> {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.timeout = timeout;
xhr.responseType = 'json';
// 设置认证头
if (HttpUtil._authToken) {
xhr.setRequestHeader('Authorization', `Bearer ${HttpUtil._authToken}`);
}
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response as T);
} else {
reject(new Error(`HTTP 错误: ${xhr.status}`));
}
};
xhr.onerror = () => {
reject(new Error('网络请求失败'));
};
xhr.ontimeout = () => {
reject(new Error('请求超时'));
};
xhr.send();
});
}
/**
* 发送 POST 请求
* @param url 请求 URL
* @param data 请求体数据
* @param timeout 超时时间(毫秒),默认 10000
* @returns Promise<Response>
*/
static post<T>(url: string, data: object, timeout: number = 10000): Promise<T> {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.timeout = timeout;
xhr.responseType = 'json';
xhr.setRequestHeader('Content-Type', 'application/json');
// 设置认证头
if (HttpUtil._authToken) {
xhr.setRequestHeader('Authorization', `Bearer ${HttpUtil._authToken}`);
}
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response as T);
} else {
reject(new Error(`HTTP 错误: ${xhr.status}`));
}
};
xhr.onerror = () => {
reject(new Error('网络请求失败'));
};
xhr.ontimeout = () => {
reject(new Error('请求超时'));
};
xhr.send(JSON.stringify(data));
});
}
}