import requests import json from .config_loader import ConfigLoader import logging class ApiUtils: def __init__(self): """初始化 API 工具类""" self.config_loader = ConfigLoader.get_instance() self.base_url = self.config_loader.get_value("app.base_url", "") self.apis = self.config_loader.get_value("apis", {}) def get_full_url(self, url): """ 根据 API 键获取完整 URL Args: url: API 配置中的键名 Returns: str: 完整的 URL """ if url not in self.apis: return None return f"{self.base_url}{self.apis[url]}" def request(self, method, url, params=None, data=None, json_data=None, headers=None): """ 发送 HTTP 请求 Args: method: 请求方法,如 'GET', 'POST' 等 url: API 配置中的键名 params: URL 参数 data: 表单数据 json_data: JSON 数据 headers: 请求头 Returns: dict: 响应数据 """ full_url = self.get_full_url(url) if not full_url: return {"success": False, "message": f"未找到 API 配置: {url}"} # 处理托盘号参数 # 如果是托盘查询接口,并且有tp_note参数,将其附加到URL末尾 if url == "get_tray_info" and params and "tp_note" in params: full_url = f"{full_url}{params['tp_note']}" # 从params中移除tp_note,因为已经添加到URL中 params = {k: v for k, v in params.items() if k != "tp_note"} default_headers = { "Content-Type": "application/json" } # 如果是 POST 请求且有表单数据,则使用 form-data 格式 if method.upper() == "POST" and data and not json_data: # 对于 form-data 格式,不设置 Content-Type,让 requests 自动处理 default_headers = {} if headers: default_headers.update(headers) try: # 记录请求信息,便于调试 logging.info(f"发送 {method} 请求到 {full_url}") logging.info(f"参数: {params}") logging.info(f"数据: {data}") logging.info(f"JSON数据: {json_data}") logging.info(f"请求头: {default_headers}") response = requests.request( method=method, url=full_url, params=params, data=data, json=json_data, headers=default_headers ) # 记录响应状态 logging.info(f"响应状态码: {response.status_code}") logging.info(f"响应内容: {response.text[:500]}...") # 只记录前500个字符 response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: logging.error(f"请求异常: {str(e)}") return {"success": False, "message": f"请求异常: {str(e)}"} except json.JSONDecodeError as e: logging.error(f"响应数据不是有效的JSON格式: {str(e)}") return {"success": False, "message": "响应数据不是有效的 JSON 格式"} def get(self, url, params=None, headers=None): """ 发送 GET 请求 Args: url: API 配置中的键名 params: URL 参数 headers: 请求头 Returns: dict: 响应数据 """ return self.request("GET", url, params=params, headers=headers) def post(self, url, json_data=None, data=None, headers=None): """ 发送 POST 请求 Args: url: API 配置中的键名 json_data: JSON 数据 data: 表单数据 headers: 请求头 Returns: dict: 响应数据 """ return self.request("POST", url, data=data, json_data=json_data, headers=headers) def put(self, url, json_data=None, data=None, headers=None): """ 发送 PUT 请求 Args: url: API 配置中的键名 json_data: JSON 数据 data: 表单数据 headers: 请求头 Returns: dict: 响应数据 """ return self.request("PUT", url, data=data, json_data=json_data, headers=headers) def delete(self, url, params=None, headers=None): """ 发送 DELETE 请求 Args: url: API 配置中的键名 params: URL 参数 headers: 请求头 Returns: dict: 响应数据 """ return self.request("DELETE", url, params=params, headers=headers)