create http client and base service

This commit is contained in:
Fran Jurmanović
2021-05-28 19:08:11 +02:00
parent 888c76829c
commit e0756282b6
10 changed files with 186 additions and 1 deletions

0
src/common/index.ts Normal file
View File

0
src/components/index.ts Normal file
View File

View File

@@ -0,0 +1,5 @@
{
"apiUrl": "localhost:4000",
"apiVersion": "v1",
"ssl": false
}

0
src/core/index.ts Normal file
View File

View File

@@ -0,0 +1,30 @@
import { HttpClient } from "core/services";
class BaseService {
private httpClient: HttpClient;
constructor(private endpoint: string) {
this.httpClient = new HttpClient();
}
getAll = (headers: HeadersInit) => {
return this.httpClient.get(this.endpoint, null, headers);
};
get = (params: Object, headers: HeadersInit) => {
return this.httpClient.get(this.endpoint, params, headers);
};
put = (data: Object, headers: HeadersInit) => {
return this.httpClient.put(this.endpoint, data, headers);
};
post = (data: Object, headers: HeadersInit) => {
return this.httpClient.post(this.endpoint, data, headers);
};
delete = (data: Object, headers: HeadersInit) => {
return this.httpClient.delete(this.endpoint, data, headers);
};
}
export default BaseService;

View File

@@ -0,0 +1,117 @@
import settings from "configs/development/app-settings.json";
class HttpClient {
private url: string;
constructor() {
this.url = `${settings.ssl ? "https" : "http"}://${settings.apiUrl}/${
settings.apiVersion
}`;
}
post(url: string, data: Object, headersParam: HeadersInit): Promise<any> {
let headers: Headers = new Headers(headersParam);
let body: BodyType = null;
if (data instanceof FormData) {
body = data;
} else {
body = JSON.stringify(data);
headers.append("Content-Type", "application/json");
}
let options: OptionsType = {
method: "POST",
headers: headers,
body: body,
};
const req: Request = new Request(resolveUrl(this.url, url), options);
return createRequest(req);
}
put(url: string, data: Object, headersParam: HeadersInit): Promise<any> {
let headers: Headers = new Headers(headersParam);
headers.append("Content-Type", "application/json");
let options: OptionsType = {
method: "PUT",
headers: headers,
body: JSON.stringify(data),
};
const req: Request = new Request(resolveUrl(this.url, url), options);
return createRequest(req);
}
delete(url: string, data: Object, headersParam: HeadersInit): Promise<any> {
let headers: Headers = new Headers(headersParam);
headers.append("Content-Type", "application/json");
let options: OptionsType = {
method: "DELETE",
headers: headers,
body: JSON.stringify(data),
};
const req: Request = new Request(resolveUrl(this.url, url), options);
return createRequest(req);
}
get(url: string, params: Object, headersParam: HeadersInit): Promise<any> {
let headers: Headers = new Headers(headersParam);
let options: OptionsType = {
method: "GET",
headers: headers,
};
let paramsPath: string = "";
if (params) {
let urlParams = new URLSearchParams(Object.entries(params));
paramsPath = "?" + urlParams;
}
const req: Request = new Request(
resolveUrl(this.url, url + paramsPath),
options
);
return createRequest(req);
}
}
export default HttpClient;
async function createRequest(request: Request): Promise<Response> {
let response: Response = await fetch(request);
if (!response.ok && response.status !== 403 && response.status !== 400) {
throw new Error(`HTTP error! status: ${response.status}`);
} else {
if (response.headers.get("Content-Type") !== null) {
let newResponse: Response = await createResponse(response);
return newResponse;
}
return response;
}
}
async function createResponse(response: Response): Promise<any> {
const type: string = response.headers.get("Content-Type");
const body = (): Promise<any> => {
if (type.indexOf("application/json") !== -1) {
return response.json();
}
return response.text();
};
return body();
}
function resolveUrl(url: string, path: string): string {
if (path.includes("http") || path.includes("://")) {
return path;
}
const fixedPath = path.split("/").join("/");
const urlWithPath = `${url.endsWith("/") ? url : `${url}/`}${path}`;
return urlWithPath;
}
type BodyType = string | FormData;
type OptionsType = {
method: string;
headers?: Headers;
body?: BodyType;
};

View File

@@ -0,0 +1,2 @@
export { default as HttpClient } from "./http-service/HttpClient";
export { default as BaseService } from "./base-service/BaseService";

0
src/pages/index.ts Normal file
View File