12345678910111213141516171819202122232425262728293031323334 |
- import asyncio
- from typing import Optional, Dict
- import aiohttp
- class AsyncRequestClient:
- """
- 可独立复用的异步请求客户端,支持重试、日志结构化和限流预留
- """
- def __init__(self, logger=None, max_retries=3, timeout=30):
- self.logger = logger
- self.max_retries = max_retries
- self.timeout = timeout
- async def request(self, session: aiohttp.ClientSession, method: str, url: str, **kwargs) -> Optional[Dict]:
- retries = 0
- while retries < self.max_retries:
- try:
- if self.logger:
- self.logger.info(f"请求 {method} {url}, 尝试 {retries+1}/{self.max_retries}")
- async with session.request(method, url, **kwargs) as response:
- response.raise_for_status()
- return await response.json()
- except Exception as e:
- retries += 1
- if retries >= self.max_retries:
- if self.logger:
- self.logger.error(f"请求失败达到最大重试次数: {e}")
- raise
- if self.logger:
- self.logger.warning(f"请求失败 {e}, 重试 {retries}/{self.max_retries}")
- await asyncio.sleep(1)
|