123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- export type Method =
- | 'get'
- | 'GET'
- | 'delete'
- | 'DELETE'
- | 'head'
- | 'HEAD'
- | 'options'
- | 'OPTIONS'
- | 'post'
- | 'POST'
- | 'put'
- | 'PUT'
- | 'patch'
- | 'PATCH';
- /**
- * Parse route parameters for responseType
- */
- const reg = /:[a-z|A-Z]+/g;
- export function parseParams(url: string): Array<string> {
- const ps = url.match(reg);
- if (!ps) {
- return [];
- }
- return ps.map((k) => k.replace(/:/, ''));
- }
- /**
- * Generate url and parameters
- * @param url
- * @param params
- */
- export function genUrl(url: string, params: unknown) {
- if (!params) {
- return url;
- }
- const ps = parseParams(url);
- ps.forEach((k) => {
- const reg = new RegExp(`:${k}`);
- url = url.replace(reg, params[k]);
- });
- const path: Array<string> = [];
- for (const key of Object.keys(params)) {
- if (!ps.find((k) => k === key)) {
- path.push(`${key}=${params[key]}`);
- }
- }
- return url + (path.length > 0 ? `?${path.join('&')}` : '');
- }
- export async function request({
- method,
- url,
- data,
- config = {}
- }: {
- method: Method;
- url: string;
- data?: unknown;
- config?: unknown;
- }) {
- const response = await fetch(url, {
- method: method.toLocaleUpperCase(),
- credentials: 'include',
- headers: {
- 'Content-Type': 'application/json'
- },
- body: data ? JSON.stringify(data) : undefined,
- // @ts-ignore
- ...config
- });
- return response.json();
- }
- function api<T>(
- method: Method = 'get',
- url: string,
- req: any,
- config?: unknown
- ): Promise<T> {
- if (url.match(/:/) || method.match(/get|delete/i)) {
- url = genUrl(url, req.params || req.forms);
- }
- method = method.toLocaleLowerCase() as Method;
- switch (method) {
- case 'get':
- return request({method: 'get', url, data: req, config});
- case 'delete':
- return request({method: 'delete', url, data: req, config});
- case 'put':
- return request({method: 'put', url, data: req, config});
- case 'post':
- return request({method: 'post', url, data: req, config});
- case 'patch':
- return request({method: 'patch', url, data: req, config});
- default:
- return request({method: 'post', url, data: req, config});
- }
- }
- export const webapi = {
- get<T>(url: string, req: unknown, config?: unknown): Promise<T> {
- return api<T>('get', url, req, config);
- },
- delete<T>(url: string, req: unknown, config?: unknown): Promise<T> {
- return api<T>('delete', url, req, config);
- },
- put<T>(url: string, req: unknown, config?: unknown): Promise<T> {
- return api<T>('get', url, req, config);
- },
- post<T>(url: string, req: unknown, config?: unknown): Promise<T> {
- return api<T>('post', url, req, config);
- },
- patch<T>(url: string, req: unknown, config?: unknown): Promise<T> {
- return api<T>('patch', url, req, config);
- }
- };
- export default webapi
|