packages/editor-core/src/utils/request.ts (122 lines of code) (raw):
import Debug from 'debug';
const debug = Debug('request');
export function serialize(obj?: object): string {
if (!obj) {
return '';
}
const rst: string[] = [];
Object.entries(obj || {}).forEach(([key, val]): void => {
if (val === null || val === undefined || val === '') return;
if (typeof val === 'object') rst.push(`${key}=${encodeURIComponent(JSON.stringify(val))}`);
else rst.push(`${key}=${encodeURIComponent(val)}`);
});
return rst.join('&');
}
export function buildUrl(dataAPI: string, params?: object): string {
const paramStr = serialize(params);
if (paramStr) {
return dataAPI.indexOf('?') > 0 ? `${dataAPI}&${paramStr}` : `${dataAPI}?${paramStr}`;
}
return dataAPI;
}
export function get(dataAPI: string, params?: object, headers?: object, otherProps?: object): Promise<any> {
const fetchHeaders = {
Accept: 'application/json',
...headers,
};
return request(buildUrl(dataAPI, params), 'GET', undefined, fetchHeaders, otherProps);
}
export function post(dataAPI: string, params?: object, headers?: object, otherProps?: object): Promise<any> {
const fetchHeaders = {
Accept: 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
...headers,
};
return request(
dataAPI,
'POST',
fetchHeaders['Content-Type'].indexOf('application/json') > -1 || Array.isArray(params)
? JSON.stringify(params)
: serialize(params),
fetchHeaders,
otherProps,
);
}
export function request(
dataAPI: string,
method = 'GET',
data?: object | string,
headers?: object,
otherProps?: any,
): Promise<any> {
return new Promise((resolve, reject): void => {
if (otherProps && otherProps.timeout) {
setTimeout((): void => {
reject(new Error('timeout'));
}, otherProps.timeout);
}
fetch(dataAPI, {
method,
credentials: 'include',
headers,
body: data,
...otherProps,
})
.then((response: Response): any => {
switch (response.status) {
case 200:
case 201:
case 202:
return response.json();
case 204:
if (method === 'DELETE') {
return {
success: true,
};
} else {
return {
__success: false,
code: response.status,
};
}
case 400:
case 401:
case 403:
case 404:
case 406:
case 410:
case 422:
case 500:
return response
.json()
.then((res: object): any => {
return {
__success: false,
code: response.status,
data: res,
};
})
.catch((): object => {
return {
__success: false,
code: response.status,
};
});
default:
return null;
}
})
.then((json: any): void => {
if (json && json.__success !== false) {
resolve(json);
} else {
delete json.__success;
reject(json);
}
})
.catch((err: Error): void => {
debug(err);
reject(err);
});
});
}