← back to Wine Finder Next
src/api/httpClient.ts
61 lines
/**
* HTTP Client - Centralized API request handling
*/
interface RequestOptions {
method?: 'GET' | 'POST';
body?: any;
headers?: Record<string, string>;
}
export class HttpClient {
private baseUrl: string;
constructor(baseUrl: string = '') {
this.baseUrl = baseUrl;
}
async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {
const url = `${this.baseUrl}${endpoint}`;
const { method = 'GET', body, headers = {} } = options;
const config: RequestInit = {
method,
headers: {
'Content-Type': 'application/json',
...headers,
},
};
if (body && method !== 'GET') {
config.body = JSON.stringify(body);
}
try {
const response = await fetch(url, config);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
} catch (error) {
console.error(`API request failed for ${endpoint}:`, error);
throw error;
}
}
async get<T>(endpoint: string, params?: Record<string, string>): Promise<T> {
const queryString = params
? '?' + new URLSearchParams(params).toString()
: '';
return this.request<T>(`${endpoint}${queryString}`);
}
async post<T>(endpoint: string, body: any): Promise<T> {
return this.request<T>(endpoint, { method: 'POST', body });
}
}
export const apiClient = new HttpClient('/api');