jobs/eam-integrations/scripts/api/util/api_adapter.py (73 lines of code) (raw):
import requests
import json
import logging
from typing import Dict, List
from requests.structures import CaseInsensitiveDict
class Result:
def __init__(self, status_code: int, headers: CaseInsensitiveDict,
message: str = '', data: List[Dict] = None):
self.status_code = int(status_code)
self.headers = headers
self.message = str(message)
self.data = data if data else []
class APIAdaptorException(Exception):
pass
class APIAdaptor:
def __init__(
self, host: str, timeout: int = 30
):
self.url = host
self._logger = logging.getLogger(__name__)
self.timeout = timeout
# TODO review this func
def _request(
self,
http_method: str,
endpoint: str,
headers: Dict = None,
params: Dict = None,
data: Dict = None,
timeout: int = 10,
auth=None,
response_json=True
):
full_url = self.url + endpoint
try:
response = requests.request(
http_method,
full_url,
headers=headers,
params=params,
json=data,
timeout=timeout,
auth=auth
)
except APIAdaptorException as e:
self._logger.error(msg=(str(e)))
raise APIAdaptorException("Request failed") from e
try:
if response_json:
if response.text != '':
data_out = response.json()
else:
data_out = ''
else:
data_out = response.text
except (ValueError, json.JSONDecodeError) as e:
raise APIAdaptorException(f"Bad JSON in response." +
f"Response.text = {response.text} " +
f"Response.status_code = {response.status_code}") from e
is_success = 299 >= response.status_code >= 200 # 200 to 299 is OK
if is_success:
return Result(response.status_code, headers=response.headers,
message=response.reason, data=data_out)
raise Exception(data_out)
def get(self, endpoint: str, params: Dict = None, headers: str = None, auth=None, timeout=20,response_json=True):
return self._request(http_method="GET", endpoint=endpoint, params=params, headers=headers, auth=auth,timeout=timeout,response_json=response_json)
def post(self, endpoint: str, params: Dict = None, headers: str = None, data: Dict = None, auth=None, timeout=20):
return self._request(
http_method="POST", endpoint=endpoint, params=params, data=data, headers=headers, auth=auth, timeout=timeout
)
def patch(self, endpoint: str, params: Dict = None, headers: str = None, data: Dict = None):
return self._request(http_method="PATCH", endpoint=endpoint, params=params, data=data, headers=headers)
def delete(self, endpoint: str, params: Dict = None, headers: str = None, data: Dict = None):
return self._request(http_method="DELETE", endpoint=endpoint, params=params, data=data, headers=headers)