186 lines
5.1 KiB
TypeScript
186 lines
5.1 KiB
TypeScript
interface NetRequestParams {
|
|
url: string;
|
|
method: string;
|
|
queryParams?: any;
|
|
payload?: any;
|
|
additionalHeaders?: any;
|
|
}
|
|
|
|
/**
|
|
* 记录响应详情并返回响应日志对象。
|
|
* @param response - 响应对象。
|
|
* @param method - 请求使用的HTTP方法。
|
|
* @param headers - 请求头。
|
|
* @param requestBody - 请求体。
|
|
* @param responseBody - 响应体。
|
|
* @returns 响应日志对象。
|
|
*/
|
|
const logResponse = (
|
|
response: Response,
|
|
method: string,
|
|
headers: any,
|
|
requestBody: any,
|
|
responseBody: any
|
|
) => {
|
|
const responseLog = {
|
|
ok: response.ok,
|
|
status: response.status,
|
|
statusText: response.statusText,
|
|
url: response.url,
|
|
method: method,
|
|
requestHeaders: headers,
|
|
responseHeaders: response.headers,
|
|
requestBody,
|
|
responseBody,
|
|
};
|
|
console.log("🚀 ~ responseLog:", JSON.stringify(responseLog, null, 2));
|
|
return responseLog;
|
|
};
|
|
|
|
/**
|
|
* 发送网络请求并返回一个解析为响应数据的Promise。
|
|
* @param url - 要发送请求的URL。
|
|
* @param method - 请求使用的HTTP方法。
|
|
* @param queryParams - 要包含在URL中的查询参数。
|
|
* @param payload - 请求的有效负载数据。
|
|
* @param additionalHeaders - 要包含在请求中的附加头。
|
|
* @returns 一个解析为响应数据的Promise。
|
|
* @throws 如果网络响应不成功或存在解析错误,则抛出错误。
|
|
*/
|
|
const netTool = async <T = any>({
|
|
url,
|
|
method,
|
|
queryParams,
|
|
payload,
|
|
additionalHeaders,
|
|
}: NetRequestParams): Promise<T> => {
|
|
// 拼接完整的URL
|
|
let fullUrl = url;
|
|
if (queryParams) {
|
|
if (typeof queryParams === "string") {
|
|
fullUrl = `${url}?${queryParams}`;
|
|
} else {
|
|
const queryString = new URLSearchParams(queryParams).toString();
|
|
if (queryString) fullUrl = `${url}?${queryString}`;
|
|
}
|
|
}
|
|
|
|
// 设置请求头
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
...additionalHeaders,
|
|
};
|
|
|
|
// 发送请求
|
|
const res = await fetch(fullUrl, {
|
|
method,
|
|
body: JSON.stringify(payload),
|
|
headers,
|
|
});
|
|
// 获取响应数据
|
|
let resData: any = null;
|
|
try {
|
|
resData = await res.json();
|
|
} catch (error) {
|
|
resData = "解析为JSON时出错";
|
|
}
|
|
|
|
// 记录响应
|
|
logResponse(res, method, headers, payload, resData);
|
|
if (!res.ok) {
|
|
if (resData?.msg) {
|
|
throw new Error(resData.msg);
|
|
}
|
|
throw new Error("网络响应异常");
|
|
}
|
|
if (resData === "解析为JSON时出错") {
|
|
throw new Error("解析响应数据异常");
|
|
}
|
|
return resData as T;
|
|
};
|
|
|
|
/**
|
|
* 发送GET请求并返回一个解析为响应数据的Promise。
|
|
*
|
|
* @param url - 要发送请求的URL。
|
|
* @param queryParams - 要包含在URL中的查询参数。
|
|
* @param additionalHeaders - 要包含在请求中的附加头。
|
|
* @returns 一个解析为响应数据的Promise。
|
|
*/
|
|
netTool.get = <T = any>(
|
|
url: string,
|
|
queryParams?: any,
|
|
additionalHeaders?: any
|
|
): Promise<T> =>
|
|
netTool({ url, method: "get", queryParams, additionalHeaders });
|
|
|
|
/**
|
|
* 发送POST请求并返回一个解析为响应数据的Promise。
|
|
*
|
|
* @param url - 要发送请求的URL。
|
|
* @param payload - 请求的有效负载数据。
|
|
* @param queryParams - 要包含在URL中的查询参数。
|
|
* @param additionalHeaders - 要包含在请求中的附加头。
|
|
* @returns 一个解析为响应数据的Promise。
|
|
*/
|
|
netTool.post = <T = any>(
|
|
url: string,
|
|
payload?: any,
|
|
queryParams?: any,
|
|
additionalHeaders?: any
|
|
): Promise<T> =>
|
|
netTool({ url, method: "post", payload, queryParams, additionalHeaders });
|
|
|
|
/**
|
|
* 发送PUT请求并返回一个解析为响应数据的Promise。
|
|
*
|
|
* @param url - 要发送请求的URL。
|
|
* @param payload - 请求的有效负载数据。
|
|
* @param queryParams - 要包含在URL中的查询参数。
|
|
* @param additionalHeaders - 要包含在请求中的附加头。
|
|
* @returns 一个解析为响应数据的Promise。
|
|
*/
|
|
netTool.put = <T = any>(
|
|
url: string,
|
|
payload: any,
|
|
queryParams?: any,
|
|
additionalHeaders?: any
|
|
): Promise<T> =>
|
|
netTool({ url, method: "put", payload, queryParams, additionalHeaders });
|
|
|
|
/**
|
|
* 发送DELETE请求并返回一个解析为响应数据的Promise。
|
|
*
|
|
* @param url - 要发送请求的URL。
|
|
* @param payload - 请求的有效负载数据。
|
|
* @param queryParams - 要包含在URL中的查询参数。
|
|
* @param additionalHeaders - 要包含在请求中的附加头。
|
|
* @returns 一个解析为响应数据的Promise。
|
|
*/
|
|
netTool.del = <T = any>(
|
|
url: string,
|
|
payload: any,
|
|
queryParams?: any,
|
|
additionalHeaders?: any
|
|
): Promise<T> =>
|
|
netTool({ url, method: "delete", payload, queryParams, additionalHeaders });
|
|
|
|
/**
|
|
* 发送PATCH请求并返回一个解析为响应数据的Promise。
|
|
*
|
|
* @param url - 要发送请求的URL。
|
|
* @param payload - 请求的有效负载数据。
|
|
* @param queryParams - 要包含在URL中的查询参数。
|
|
* @param additionalHeaders - 要包含在请求中的附加头。
|
|
* @returns 一个解析为响应数据的Promise。
|
|
*/
|
|
netTool.patch = <T = any>(
|
|
url: string,
|
|
payload: any,
|
|
queryParams?: any,
|
|
additionalHeaders?: any
|
|
): Promise<T> =>
|
|
netTool({ url, method: "patch", payload, queryParams, additionalHeaders });
|
|
|
|
export default netTool;
|