本文目录导读:

下面给你一个Python接口请求封装的完整案例,包含常见的封装模式、异常处理、日志、重试机制等,适合实际项目使用。
基础封装版(最常用)
使用 requests 库,封装 GET、POST、PUT、DELETE 等常见方法。
import requests
import json
class ApiClient:
"""接口请求封装类"""
def __init__(self, base_url="", headers=None):
self.base_url = base_url.rstrip("/")
self.session = requests.Session()
self.headers = headers or {
"Content-Type": "application/json",
"Accept": "application/json"
}
self.session.headers.update(self.headers)
def _request(self, method, endpoint, **kwargs):
url = f"{self.base_url}/{endpoint.lstrip('/')}"
try:
response = self.session.request(method, url, **kwargs)
response.raise_for_status() # 非200状态会抛出异常
return response.json()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
def get(self, endpoint, params=None):
return self._request("GET", endpoint, params=params)
def post(self, endpoint, data=None, json_data=None):
return self._request("POST", endpoint, data=data, json=json_data)
def put(self, endpoint, data=None, json_data=None):
return self._request("PUT", endpoint, data=data, json=json_data)
def delete(self, endpoint):
return self._request("DELETE", endpoint)
# 使用示例
client = ApiClient(base_url="https://api.example.com")
result = client.get("/users", params={"page": 1})
print(result)
进阶封装版(带日志、重试、自定义异常)
import requests
import logging
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# 配置日志
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
class APIClientError(Exception):
"""自定义API异常"""
pass
class AdvancedApiClient:
"""进阶接口请求封装"""
def __init__(self, base_url="", headers=None, timeout=10, max_retries=3):
self.base_url = base_url.rstrip("/")
self.timeout = timeout
self.session = requests.Session()
# 设置重试策略
retry_strategy = Retry(
total=max_retries,
backoff_factor=0.5, # 重试间隔倍数
status_forcelist=[500, 502, 503, 504], # 哪些状态码需要重试
allowed_methods=["GET", "POST", "PUT", "DELETE"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
self.session.mount("http://", adapter)
self.session.mount("https://", adapter)
# 设置默认请求头
self.headers = headers or {
"Content-Type": "application/json",
"Accept": "application/json"
}
self.session.headers.update(self.headers)
def _request(self, method, endpoint, **kwargs):
"""统一的请求处理方法"""
url = f"{self.base_url}/{endpoint.lstrip('/')}"
kwargs.setdefault("timeout", self.timeout)
try:
logger.info(f"发送 {method} 请求: {url}")
response = self.session.request(method, url, **kwargs)
# 打印响应信息
logger.info(f"响应状态码: {response.status_code}")
# 检查HTTP状态码
response.raise_for_status()
# 尝试解析JSON
try:
return response.json()
except (json.JSONDecodeError, ValueError):
logger.warning("响应不是JSON格式,返回原始文本")
return response.text
except requests.exceptions.Timeout:
logger.error(f"请求超时: {url}")
raise APIClientError(f"请求超时: {url}")
except requests.exceptions.HTTPError as e:
status_code = e.response.status_code if e.response else "未知"
logger.error(f"HTTP错误 {status_code}: {url}")
raise APIClientError(f"HTTP错误 {status_code}: {e}")
except requests.exceptions.ConnectionError:
logger.error(f"连接失败: {url}")
raise APIClientError(f"连接失败: {url}")
except Exception as e:
logger.error(f"未知错误: {e}")
raise APIClientError(f"请求失败: {e}")
def get(self, endpoint, params=None, **kwargs):
return self._request("GET", endpoint, params=params, **kwargs)
def post(self, endpoint, data=None, json=None, **kwargs):
return self._request("POST", endpoint, data=data, json=json, **kwargs)
def put(self, endpoint, data=None, json=None, **kwargs):
return self._request("PUT", endpoint, data=data, json=json, **kwargs)
def delete(self, endpoint, **kwargs):
return self._request("DELETE", endpoint, **kwargs)
# 使用示例
try:
client = AdvancedApiClient(base_url="https://api.example.com", max_retries=3)
data = {"name": "John", "age": 30}
result = client.post("/users", json=data)
print("创建用户成功:", result)
except APIClientError as e:
print(f"API调用失败: {e}")
带Token认证的封装
class AuthApiClient(AdvancedApiClient):
"""带Token认证的API客户端"""
def __init__(self, base_url, token=None, **kwargs):
super().__init__(base_url, **kwargs)
if token:
self.set_token(token)
def set_token(self, token):
"""设置认证Token"""
self.session.headers.update({
"Authorization": f"Bearer {token}"
})
def login(self, username, password, login_endpoint="/auth/login"):
"""登录并保存Token"""
data = {"username": username, "password": password}
result = self.post(login_endpoint, json=data)
if result and "token" in result:
self.set_token(result["token"])
logger.info("登录成功,Token已保存")
return result
raise APIClientError("登录失败,未获取到Token")
项目使用目录结构建议
api_client/
├── __init__.py
├── base.py # 基础封装
├── auth.py # 认证相关
├── exceptions.py # 自定义异常
├── config.py # 配置(URL、超时等)
└── utils.py # 工具函数(如数据清洗)
最佳实践总结
| 特性 | 推荐做法 |
|---|---|
| 会话复用 | 使用 requests.Session() 保持长连接 |
| 重试机制 | 针对5xx错误设置重试(1-3次) |
| 超时控制 | 设置合理的 timeout,避免卡死 |
| 日志记录 | 记录请求URL、状态码、耗时 |
| 异常处理 | 统一捕获并抛出自定义异常 |
| 环境切换 | 通过配置文件或环境变量控制base_url |
| 接口版本 | 支持 v1/users 这样的路径传参 |
如果你有具体的接口(如RESTful API、GraphQL、WebSocket等)或特定的需求(如文件上传、批量请求),可以告诉我,我可以帮你定制封装方案。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播