Files
material-api/web/commons/vendors/__init__.py
2024-05-29 10:21:31 +08:00

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