72 lines
1.7 KiB
JavaScript
72 lines
1.7 KiB
JavaScript
import Cookies from 'js-cookie';
|
|
|
|
export class HttpClient {
|
|
|
|
static ACCEPT = {
|
|
TEXT_HTML: 'text/html',
|
|
JSON: 'application/json',
|
|
};
|
|
|
|
_responseInterceptors = [];
|
|
|
|
addResponseInterceptor(interceptor) {
|
|
if (typeof interceptor === 'function') {
|
|
this._responseInterceptors.push(interceptor);
|
|
}
|
|
}
|
|
|
|
_baseUrl;
|
|
|
|
setBaseUrl(baseUrl) {
|
|
if (typeof this._baseUrl !== 'undefined') {
|
|
throw new Error('HttpClient baseUrl is already set');
|
|
}
|
|
|
|
this._baseUrl = baseUrl;
|
|
}
|
|
|
|
_defaultUrl;
|
|
|
|
setDefaultUrl(defaultUrl) {
|
|
if (typeof this._defaultUrl !== 'undefined') {
|
|
throw new Error('HttpClient defaultUrl is already set');
|
|
}
|
|
|
|
this._defaultUrl = defaultUrl;
|
|
}
|
|
|
|
|
|
get(args) {
|
|
args.method = 'GET';
|
|
return this._fetch(args);
|
|
}
|
|
|
|
post(args) {
|
|
args.method = 'POST';
|
|
args.headers = args.headers || {};
|
|
args.headers['X-XSRF-TOKEN'] = Cookies.get('XSRF-TOKEN');
|
|
return this._fetch(args);
|
|
}
|
|
|
|
_fetch(options) {
|
|
options.url = (options.url && options.url.href) || options.url || this._defaultUrl;
|
|
|
|
if (this._baseUrl && options.url && options.url.substring(0,1) === '/' && options.url.substring(0,2) !== '//')
|
|
options.url = this._baseUrl + (this._baseUrl.substring(this._baseUrl.substring.length - 1) === '/' ? '' : '/') + options.url.substring(1,0);
|
|
|
|
const requestOptions = {
|
|
credentials: 'same-origin',
|
|
...options,
|
|
};
|
|
|
|
return fetch(options.url || window.location.href, requestOptions)
|
|
.then(
|
|
(response) => {
|
|
this._responseInterceptors.forEach((interceptor) => interceptor(response, options));
|
|
return Promise.resolve(response);
|
|
},
|
|
Promise.reject,
|
|
).catch(console.error);
|
|
}
|
|
}
|