import logging from typing import Any, Dict, Optional, Tuple, Union import requests class APIRequestHandler: def __init__( self, default_headers: Optional[Dict[str, str]] = None, timeout: int = 10 ) -> None: self.session = requests.Session() self.default_headers: Dict[str, str] = default_headers or {} self.timeout: int = timeout def get( self, url: str, params: Optional[Dict[str, Any]] = None, extra_headers: Optional[Dict[str, str]] = None, ) -> Union[Any, Tuple[int, Any]]: headers = {**self.default_headers, **(extra_headers or {})} try: response = self.session.get( url, headers=headers, params=params, timeout=self.timeout ) response.raise_for_status() except requests.HTTPError as http_err: resp = http_err.response logging.warning(f'GET {url} returned {resp.status_code}: {http_err}') return resp.status_code, resp.json() except requests.RequestException as err: logging.error(f'GET request to {url} failed: {err}') raise return response.json() def post( self, url: str, data: Optional[Union[Dict[str, Any], str]] = None, json: Optional[Any] = None, extra_headers: Optional[Dict[str, str]] = None, ) -> Any: headers = {**self.default_headers, **(extra_headers or {})} try: response = self.session.post( url, headers=headers, data=data, json=json, timeout=self.timeout ) return response.json() except requests.RequestException as e: logging.error(f'POST request failed: {e}') raise