client.py
2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import json
import os
import time
from typing import Dict, Optional
import requests
class ApiClient:
def __init__(self, base_url: str):
self.base_url = base_url.rstrip('/')
self.session = requests.Session()
self.token_path = os.path.join(os.path.dirname(__file__), '.token.json')
self.token: Optional[str] = None
self._load_token()
def _load_token(self) -> None:
if os.path.exists(self.token_path):
try:
with open(self.token_path, 'r', encoding='utf-8') as f:
data = json.load(f)
self.token = data.get('token')
except Exception:
self.token = None
def _save_token(self, token: str) -> None:
self.token = token
data = {
'token': token,
'saved_at': int(time.time())
}
with open(self.token_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def set_token(self, token: str) -> None:
self._save_token(token)
def _headers(self, extra: Optional[Dict[str, str]] = None) -> Dict[str, str]:
headers: Dict[str, str] = {
'Content-Type': 'application/json'
}
if self.token:
headers['Authorization'] = f'Bearer {self.token}'
if extra:
headers.update(extra)
return headers
def post(self, path: str, json_body: Dict, auth: bool = True) -> requests.Response:
url = f"{self.base_url}{path}"
headers = self._headers() if auth else {'Content-Type': 'application/json'}
return self.session.post(url, headers=headers, json=json_body, timeout=30)
def get(self, path: str, params: Optional[Dict] = None, auth: bool = True) -> requests.Response:
url = f"{self.base_url}{path}"
headers = self._headers() if auth else {}
return self.session.get(url, headers=headers, params=params or {}, timeout=30)
def put(self, path: str, json_body: Dict, auth: bool = True) -> requests.Response:
url = f"{self.base_url}{path}"
headers = self._headers() if auth else {'Content-Type': 'application/json'}
return self.session.put(url, headers=headers, json=json_body, timeout=30)
def delete(self, path: str, auth: bool = True) -> requests.Response:
url = f"{self.base_url}{path}"
headers = self._headers() if auth else {}
return self.session.delete(url, headers=headers, timeout=30)