uni-ticket-system/src/http/main.ts

134 lines
4.1 KiB
TypeScript
Raw Normal View History

2023-12-07 03:08:43 +00:00
type HttpMethod =
| "GET"
| 'get'
| "POST"
| 'post'
| "PUT"
| 'put'
| "DELETE"
| 'delete'
2023-12-08 07:55:35 +00:00
| "CONNECT"
| 'connect'
2023-12-07 03:08:43 +00:00
| "OPTIONS"
| 'options'
| "TRACE"
2023-12-08 07:55:35 +00:00
| 'trace';
2023-12-07 03:08:43 +00:00
interface RequestOptions {
baseUrl?: string;
url: string;
data?: Record<string, any>;
method?: HttpMethod;
header?: Record<string, string>;
2023-12-07 03:18:10 +00:00
params?: Record<string, any>;
2023-12-07 03:08:43 +00:00
}
type RequestInterceptor = (config: RequestOptions) => RequestOptions;
type ResponseInterceptor = (response: any) => any;
class uniFetch {
baseUrl: string;
defaultHeader: Record<string, string>;
interceptors: { request: RequestInterceptor | null; response: ResponseInterceptor | null };
constructor({ baseUrl = '', defaultHeader = {}, interceptors = { request: null, response: null } }: {
baseUrl?: string;
defaultHeader?: Record<string, string>;
2023-12-08 08:59:43 +00:00
interceptors?: { request: RequestInterceptor | null; response: ResponseInterceptor | null};
2023-12-07 03:08:43 +00:00
}) {
this.baseUrl = baseUrl;
this.defaultHeader = {
"Content-Type": "application/json;charset=UTF-8",
...defaultHeader,
};
this.interceptors = interceptors;
}
setBaseUrl(baseUrl: string): void {
this.baseUrl = baseUrl;
}
setDefaultHeader(header: Record<string, string>): void {
this.defaultHeader = header;
}
request(options: RequestOptions): Promise<any> {
options = options || {};
options.baseUrl = options.baseUrl || this.baseUrl;
options.url = options.baseUrl + options.url;
options.data = options.data || {};
2023-12-08 08:59:43 +00:00
options.method = (options.method?.toUpperCase() || "GET") as HttpMethod;
2023-12-07 03:08:43 +00:00
options.header = options.header || this.defaultHeader;
if (this.interceptors.request) {
options = this.interceptors.request(options);
}
return new Promise((resolve, reject) => {
2023-12-08 08:59:43 +00:00
// @ts-ignore
2023-12-07 03:08:43 +00:00
uni.request({
...options,
success: (res) => {
const response = this.handleResponse(res);
resolve(response);
},
fail: (err) => {
const error = this.handleError(err);
reject(error);
},
});
});
}
private handleResponse(response: any): any {
if (this.interceptors.response) {
response = this.interceptors.response(response);
}
const statusCode = response.statusCode;
if (statusCode === 200) {
return response.data;
} else {
throw response;
}
}
private handleError(error: any): any {
throw error;
}
setRequestInterceptor(interceptor: RequestInterceptor): void {
this.interceptors.request = interceptor;
}
setResponseInterceptor(interceptor: ResponseInterceptor): void {
this.interceptors.response = interceptor;
}
get(options: RequestOptions): Promise<any> {
options = options || {};
options.method = "GET";
return this.request(this.buildRequestOptions(options));
}
private buildRequestOptions(options: RequestOptions): RequestOptions {
2023-12-08 08:59:43 +00:00
if (options.params && Object.keys(options.params).length > 0) {
2023-12-07 03:08:43 +00:00
const queryString = Object.keys(options.params)
2023-12-08 08:59:43 +00:00
.map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(options.params![key])}`)
2023-12-07 03:08:43 +00:00
.join('&');
options.url += `?${queryString}`;
}
delete options.params;
return options;
}
post(options: RequestOptions): Promise<any> {
options = options || {};
options.method = "POST";
return this.request(this.buildRequestOptions(options));
}
put(options: RequestOptions): Promise<any> {
options = options || {};
options.method = "PUT";
return this.request(this.buildRequestOptions(options));
}
delete(options: RequestOptions): Promise<any> {
options = options || {};
options.method = "DELETE";
return this.request(this.buildRequestOptions(options));
}
}
export { uniFetch}