2022-02-16 11:20:17 +08:00

141 lines
3.3 KiB
TypeScript

import 'whatwg-fetch';
import fetchJsonp from 'fetch-jsonp';
import { serializeParams } from '.';
function buildUrl(dataAPI: any, params: any) {
const paramStr = serializeParams(params);
if (paramStr) {
return dataAPI.indexOf('?') > 0 ? `${dataAPI}&${paramStr}` : `${dataAPI}?${paramStr}`;
}
return dataAPI;
}
export function get(dataAPI: any, params = {}, headers = {}, otherProps = {}) {
headers = {
Accept: 'application/json',
...headers,
};
dataAPI = buildUrl(dataAPI, params);
return request(dataAPI, 'GET', null, headers, otherProps);
}
export function post(dataAPI: any, params = {}, headers: any = {}, otherProps = {}) {
headers = {
Accept: 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
...headers,
};
return request(
dataAPI,
'POST',
headers['Content-Type'].indexOf('application/json') > -1 || Array.isArray(params)
? JSON.stringify(params)
: serializeParams(params),
headers,
otherProps,
);
}
export function request(dataAPI: any, method = 'GET', data: any, headers = {}, otherProps: any = {}) {
switch (method) {
case 'PUT':
case 'DELETE':
headers = {
Accept: 'application/json',
'Content-Type': 'application/json',
...headers,
};
data = JSON.stringify(data || {});
break;
}
return new Promise((resolve, reject) => {
if (otherProps.timeout) {
setTimeout(() => {
reject(new Error('timeout'));
}, otherProps.timeout);
}
fetch(dataAPI, {
method,
credentials: 'include',
headers,
body: data,
...otherProps,
})
.then((response) => {
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) => {
return {
__success: false,
code: response.status,
data: res,
};
})
.catch(() => {
return {
__success: false,
code: response.status,
};
});
}
return null;
})
.then((json) => {
if (json && json.__success !== false) {
resolve(json);
} else {
delete json.__success;
reject(json);
}
})
.catch((err) => {
reject(err);
});
});
}
export function jsonp(dataAPI: any, params = {}, otherProps = {}) {
return new Promise((resolve, reject) => {
otherProps = {
timeout: 5000,
...otherProps,
};
fetchJsonp(buildUrl(dataAPI, params), otherProps)
.then((response) => response.json())
.then((json) => {
if (json) {
resolve(json);
} else {
reject();
}
})
.catch((err) => {
reject(err);
});
});
}