39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
function getHeaders(): Record<string, string> {
|
|
return {
|
|
'Content-Type': 'application/json',
|
|
};
|
|
}
|
|
|
|
async function get<T>(uri: string, baseUrl: string = ''): Promise<T> {
|
|
const headers = getHeaders();
|
|
const theUrl = baseUrl ? `${baseUrl}/${uri.replace(/^\//, '')}` : uri;
|
|
const res = await fetch(theUrl, { headers });
|
|
return res.json() as Promise<T>;
|
|
}
|
|
|
|
async function post<T>(uri: string, payload?: unknown, baseUrl: string = ''): Promise<T> {
|
|
const headers = getHeaders();
|
|
const theUrl = baseUrl ? `${baseUrl}/${uri.replace(/^\//, '')}` : uri;
|
|
const res = await fetch(theUrl, {
|
|
method: 'POST',
|
|
body: JSON.stringify(payload),
|
|
headers,
|
|
});
|
|
return res.json() as Promise<T>;
|
|
}
|
|
|
|
interface HttpClient {
|
|
baseUrl: string;
|
|
get: <T>(url: string) => Promise<T>;
|
|
post: <T>(url: string, payload?: unknown) => Promise<T>;
|
|
}
|
|
|
|
export function createClient(baseUrl?: string): HttpClient {
|
|
const finalBaseUrl = baseUrl || '';
|
|
return {
|
|
baseUrl: finalBaseUrl,
|
|
get: <T>(url: string) => get<T>(url, finalBaseUrl),
|
|
post: <T>(url: string, payload?: unknown) => post<T>(url, payload, finalBaseUrl),
|
|
};
|
|
}
|