93 lines
3.8 KiB
Python
93 lines
3.8 KiB
Python
import requests
|
||
from datetime import datetime
|
||
|
||
class APIClient:
|
||
"""
|
||
Универсальный клиент для работы с API PMS.
|
||
"""
|
||
def __init__(self, base_url, access_token=None, username=None, password=None):
|
||
"""
|
||
Инициализация API клиента.
|
||
|
||
:param base_url: Базовый URL API
|
||
:param access_token: Токен доступа (если требуется)
|
||
:param username: Имя пользователя (если используется basic auth)
|
||
:param password: Пароль (если используется basic auth)
|
||
"""
|
||
self.base_url = base_url
|
||
self.access_token = access_token
|
||
self.auth = (username, password) if username and password else None
|
||
|
||
def _build_headers(self):
|
||
"""
|
||
Создает заголовки для запроса.
|
||
:return: Словарь заголовков.
|
||
"""
|
||
headers = {'Content-Type': 'application/json'}
|
||
if self.access_token:
|
||
headers['Authorization'] = f'Bearer {self.access_token}'
|
||
return headers
|
||
|
||
def _make_request(self, method, endpoint, params=None, data=None):
|
||
"""
|
||
Выполняет запрос к API.
|
||
|
||
:param method: HTTP метод ('GET', 'POST', и т.д.)
|
||
:param endpoint: Конечная точка API.
|
||
:param params: Параметры строки запроса (для GET).
|
||
:param data: Данные для тела запроса (для POST).
|
||
:return: Ответ API в формате JSON.
|
||
"""
|
||
url = f"{self.base_url}{endpoint}"
|
||
headers = self._build_headers()
|
||
try:
|
||
response = requests.request(
|
||
method=method,
|
||
url=url,
|
||
headers=headers,
|
||
params=params,
|
||
json=data,
|
||
auth=self.auth
|
||
)
|
||
response.raise_for_status() # Генерирует исключение для HTTP ошибок
|
||
return response.json()
|
||
except requests.exceptions.RequestException as e:
|
||
print(f"Ошибка при запросе {method} {url}: {e}")
|
||
return None
|
||
|
||
def get(self, endpoint, params=None):
|
||
"""
|
||
Выполняет GET запрос.
|
||
:param endpoint: Конечная точка API.
|
||
:param params: Параметры строки запроса.
|
||
:return: Ответ API в формате JSON.
|
||
"""
|
||
return self._make_request('GET', endpoint, params=params)
|
||
|
||
def post(self, endpoint, data=None):
|
||
"""
|
||
Выполняет POST запрос.
|
||
:param endpoint: Конечная точка API.
|
||
:param data: Данные для тела запроса.
|
||
:return: Ответ API в формате JSON.
|
||
"""
|
||
return self._make_request('POST', endpoint, data=data)
|
||
|
||
def fetch_reservations(self, endpoint, from_date, to_date, pagination_start=0, pagination_count=50):
|
||
"""
|
||
Получение данных о бронированиях.
|
||
|
||
:param endpoint: Конечная точка API для бронирований.
|
||
:param from_date: Дата начала в формате 'YYYY-MM-DDTHH:MM:SS'.
|
||
:param to_date: Дата окончания в формате 'YYYY-MM-DDTHH:MM:SS'.
|
||
:param pagination_start: Начальная точка пагинации.
|
||
:param pagination_count: Количество записей для выборки.
|
||
:return: Ответ API в формате JSON.
|
||
"""
|
||
data = {
|
||
"from": from_date,
|
||
"until": to_date,
|
||
"pagination": {"from": pagination_start, "count": pagination_count}
|
||
}
|
||
return self.post(endpoint, data=data)
|