67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
from urllib.parse import urlencode
|
|
|
|
import requests
|
|
|
|
|
|
class ApiException(Exception):
|
|
def __init__(self, code, message):
|
|
self.code = code
|
|
self.message = message
|
|
super().__init__()
|
|
|
|
def __str__(self):
|
|
return self.message
|
|
|
|
|
|
class BaseClient:
|
|
gateway = None
|
|
timeout = 10
|
|
max_retries = 3
|
|
|
|
def _build_url(self, interface, params, query=None, files=None):
|
|
method, uri = interface
|
|
|
|
query_params = query or {}
|
|
if params and (method == 'get' or files):
|
|
query_params.update(params)
|
|
|
|
api_url = '{}/{}?{}'.format(self.gateway, uri, urlencode(query_params))
|
|
return api_url
|
|
|
|
def _get_headers(self):
|
|
return None
|
|
|
|
def call(self, interface, params=None, query=None, files=None, max_retries=max_retries, without_unpack=False):
|
|
method, *_ = interface
|
|
api_url = self._build_url(interface, params, query, files)
|
|
headers = self._get_headers()
|
|
try:
|
|
if method == 'get':
|
|
response = requests.request(method, api_url, headers=headers, timeout=self.timeout)
|
|
else:
|
|
response = requests.request(
|
|
method, api_url, headers=headers, timeout=self.timeout, json=params, files=files
|
|
)
|
|
except Exception as e:
|
|
if max_retries > 0:
|
|
return self.call(interface, params, files=files, max_retries=max_retries - 1)
|
|
raise ApiException(504, "GATEWAY TIMEOUT") from e
|
|
|
|
if without_unpack:
|
|
return response
|
|
|
|
try:
|
|
data = self.unpack(response)
|
|
except ApiException as e:
|
|
raise e
|
|
except Exception as e:
|
|
print('BaseClient.call | interface | {}'.format(interface))
|
|
print('BaseClient.call | api_url | {}'.format(api_url))
|
|
raise ApiException(502, "BAD GATEWAY") from e
|
|
|
|
return data
|
|
|
|
@staticmethod
|
|
def unpack(response):
|
|
pass
|