jiateng_ws/utils/api_utils.py

154 lines
4.9 KiB
Python
Raw Normal View History

2025-06-16 13:21:17 +08:00
import requests
import json
from .config_loader import ConfigLoader
import logging
2025-06-16 13:21:17 +08:00
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)
2025-06-16 13:21:17 +08:00