test/framework/core/base_api.py
2026-03-17 14:59:41 +08:00

64 lines
2.3 KiB
Python

import requests
import uuid
import time
from framework.core.exceptions import TokenExpiredError, APIError
from framework.core.logger import get_logger
logger = get_logger("BaseAPI")
class BaseAPI:
def __init__(self, base_url, token=None, cookie=None):
self.base_url = base_url
self.token = token
self.cookie = cookie
self.session = requests.Session()
def get_common_headers(self, referer_path=""):
headers = {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": self.token,
"cookie": self.cookie,
"origin": self.base_url,
"referer": f"{self.base_url}{referer_path}",
"sourceapp": "artificer",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
"x-request-id": uuid.uuid4().hex[:21],
}
return headers
def request(self, method, endpoint, headers=None, **kwargs):
url = f"{self.base_url}{endpoint}"
# Merge default headers if none provided
if headers is None:
headers = self.get_common_headers()
try:
resp = self.session.request(method, url, headers=headers, **kwargs)
return self._check_response(resp, endpoint)
except Exception as e:
logger.error(f"Request failed: {method} {url} - {str(e)}")
raise e
def _check_response(self, resp, step_name):
if resp.status_code in (401, 403):
raise TokenExpiredError(f"[{step_name}] HTTP {resp.status_code}: 认证失败")
if resp.status_code < 200 or resp.status_code >= 300:
raise APIError(f"[{step_name}] HTTP {resp.status_code}: {resp.text}")
try:
data = resp.json()
except Exception:
raise APIError(f"[{step_name}] 非 JSON 响应: {resp.text}")
body_status = data.get("status", 0)
if body_status != 0:
msg = data.get("message", "")
if body_status in (401, 403) or "token" in msg.lower():
raise TokenExpiredError(f"[{step_name}] 认证失效: {msg}")
raise APIError(f"[{step_name}] 业务错误: {msg}")
return data