zhaoyingbo 92fa30ef3d
All checks were successful
CI Monitor MIflow / build-image (push) Successful in 2m42s
feat: 支持初步的CR
2024-08-12 12:24:45 +00:00

229 lines
6.7 KiB
TypeScript

interface NetRequestParams {
url: string
method: string
queryParams?: any
payload?: any
additionalHeaders?: any
}
/**
* 记录响应详情并返回响应日志对象。
* @param {Response} response - 响应对象。
* @param {string} method - 请求使用的HTTP方法。
* @param {any} headers - 请求头。
* @param {any} requestBody - 请求体。
* @param {any} responseBody - 响应体。
* @returns {object} 响应日志对象。
*/
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 {NetRequestParams} params - 请求参数对象。
* @returns {Promise<T>} 一个解析为响应数据的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
let resText: string = ""
try {
resText = await res.text()
resData = JSON.parse(resText)
} catch {
/* empty */
}
// 记录响应
logResponse(res, method, headers, payload, resData || resText)
if (!res.ok) {
if (resData?.msg) {
throw new Error(resData.msg)
}
if (resText) {
throw new Error(resText)
}
throw new Error("网络响应异常")
}
// http 错误码正常,但解析异常
if (!resData) {
throw new Error("解析响应数据异常")
}
return resData as T
}
/**
* 发送GET请求并返回一个解析为响应数据的Promise。
*
* @param {string} url - 要发送请求的URL。
* @param {any} [queryParams] - 要包含在URL中的查询参数。
* @param {any} [additionalHeaders] - 要包含在请求中的附加头。
* @returns {Promise<T>} 一个解析为响应数据的Promise。
*/
netTool.get = <T = any>(
url: string,
queryParams?: any,
additionalHeaders?: any
): Promise<T> => netTool({ url, method: "get", queryParams, additionalHeaders })
/**
* 发送POST请求并返回一个解析为响应数据的Promise。
*
* @param {string} url - 要发送请求的URL。
* @param {any} [payload] - 请求的有效负载数据。
* @param {any} [queryParams] - 要包含在URL中的查询参数。
* @param {any} [additionalHeaders] - 要包含在请求中的附加头。
* @returns {Promise<T>} 一个解析为响应数据的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 {string} url - 要发送请求的URL。
* @param {any} payload - 请求的有效负载数据。
* @param {any} [queryParams] - 要包含在URL中的查询参数。
* @param {any} [additionalHeaders] - 要包含在请求中的附加头。
* @returns {Promise<T>} 一个解析为响应数据的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 {string} url - 要发送请求的URL。
* @param {any} payload - 请求的有效负载数据。
* @param {any} [queryParams] - 要包含在URL中的查询参数。
* @param {any} [additionalHeaders] - 要包含在请求中的附加头。
* @returns {Promise<T>} 一个解析为响应数据的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 {string} url - 要发送请求的URL。
* @param {any} payload - 请求的有效负载数据。
* @param {any} [queryParams] - 要包含在URL中的查询参数。
* @param {any} [additionalHeaders] - 要包含在请求中的附加头。
* @returns {Promise<T>} 一个解析为响应数据的Promise。
*/
netTool.patch = <T = any>(
url: string,
payload: any,
queryParams?: any,
additionalHeaders?: any
): Promise<T> =>
netTool({ url, method: "patch", payload, queryParams, additionalHeaders })
/**
* 创建一个表示400 Bad Request的响应对象。
*
* @param {string} msg - 错误消息。
* @param {string} [requestId] - 请求ID。
* @returns {Response} 一个表示400 Bad Request的响应对象。
*/
netTool.badRequest = (msg: string, requestId?: string) =>
Response.json({ code: 400, msg, requestId }, { status: 400 })
/**
* 创建一个表示404 Not Found的响应对象。
*
* @param {string} msg - 错误消息。
* @param {string} [requestId] - 请求ID。
* @returns {Response} 一个表示404 Not Found的响应对象。
*/
netTool.notFound = (msg: string, requestId?: string) =>
Response.json({ code: 404, msg, requestId }, { status: 404 })
/**
* 创建一个表示500 Internal Server Error的响应对象。
*
* @param {string} msg - 错误消息。
* @param {any} [data] - 错误数据。
* @param {string} [requestId] - 请求ID。
* @returns {Response} 一个表示500 Internal Server Error的响应对象。
*/
netTool.serverError = (msg: string, data?: any, requestId?: string) =>
Response.json({ code: 500, msg, data, requestId }, { status: 500 })
/**
* 创建一个表示200 OK的响应对象。
*
* @param {any} [data] - 响应数据。
* @param {string} [requestId] - 请求ID。
* @returns {Response} 一个表示200 OK的响应对象。
*/
netTool.ok = (data?: any, requestId?: string) =>
Response.json({ code: 0, msg: "success", data, requestId })
export default netTool