async_request_client.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334
  1. import asyncio
  2. from typing import Optional, Dict
  3. import aiohttp
  4. class AsyncRequestClient:
  5. """
  6. 可独立复用的异步请求客户端,支持重试、日志结构化和限流预留
  7. """
  8. def __init__(self, logger=None, max_retries=3, timeout=30):
  9. self.logger = logger
  10. self.max_retries = max_retries
  11. self.timeout = timeout
  12. async def request(self, session: aiohttp.ClientSession, method: str, url: str, **kwargs) -> Optional[Dict]:
  13. retries = 0
  14. while retries < self.max_retries:
  15. try:
  16. if self.logger:
  17. self.logger.info(f"请求 {method} {url}, 尝试 {retries+1}/{self.max_retries}")
  18. async with session.request(method, url, **kwargs) as response:
  19. response.raise_for_status()
  20. return await response.json()
  21. except Exception as e:
  22. retries += 1
  23. if retries >= self.max_retries:
  24. if self.logger:
  25. self.logger.error(f"请求失败达到最大重试次数: {e}")
  26. raise
  27. if self.logger:
  28. self.logger.warning(f"请求失败 {e}, 重试 {retries}/{self.max_retries}")
  29. await asyncio.sleep(1)