105 lines
2.9 KiB
TypeScript
105 lines
2.9 KiB
TypeScript
/**
|
||
* 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));
|
||
});
|
||
}
|
||
}
|