http_client.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import requests
  2. from typing import Dict, Any, Optional
  3. class HTTPClient:
  4. """HTTP请求工具类,用于发送各种HTTP请求"""
  5. def __init__(self, base_url: str, api_key: str = None):
  6. """
  7. 初始化HTTP客户端
  8. Args:
  9. base_url: API基础URL
  10. api_key: API密钥(Bearer token)
  11. """
  12. self.base_url = base_url.rstrip('/')
  13. self.api_key = api_key
  14. self.session = requests.Session()
  15. # 设置默认请求头
  16. if self.api_key:
  17. self.session.headers.update({
  18. 'Authorization': f'Bearer {self.api_key}'
  19. })
  20. def post(self, endpoint: str, data: Optional[Dict] = None,
  21. json: Optional[Dict] = None, files: Optional[Dict] = None,
  22. headers: Optional[Dict] = None) -> Dict[str, Any]:
  23. """
  24. 发送POST请求
  25. Args:
  26. endpoint: API端点路径(以/开头)
  27. data: 表单数据
  28. json: JSON数据
  29. files: 文件数据
  30. headers: 自定义请求头
  31. Returns:
  32. Dict: 响应JSON数据
  33. Raises:
  34. requests.exceptions.RequestException: 请求失败时抛出
  35. """
  36. url = f"{self.base_url}{endpoint}"
  37. response = self.session.post(
  38. url=url,
  39. data=data,
  40. json=json,
  41. files=files,
  42. headers=headers
  43. )
  44. response.raise_for_status() # 抛出HTTP错误
  45. return response.json()
  46. def get(self, endpoint: str, params: Optional[Dict] = None,
  47. headers: Optional[Dict] = None) -> Dict[str, Any]:
  48. """
  49. 发送GET请求
  50. Args:
  51. endpoint: API端点路径(以/开头)
  52. params: 查询参数
  53. headers: 自定义请求头
  54. Returns:
  55. Dict: 响应JSON数据
  56. Raises:
  57. requests.exceptions.RequestException: 请求失败时抛出
  58. """
  59. url = f"{self.base_url}{endpoint}"
  60. response = self.session.get(
  61. url=url,
  62. params=params,
  63. headers=headers
  64. )
  65. response.raise_for_status() # 抛出HTTP错误
  66. return response.json()
  67. def upload_file(self, endpoint: str, file_path: str, file_field_name: str = 'file',
  68. data: Optional[Dict] = None, headers: Optional[Dict] = None) -> Dict[str, Any]:
  69. """
  70. 上传文件
  71. Args:
  72. endpoint: API端点路径(以/开头)
  73. file_path: 本地文件路径
  74. file_field_name: 表单字段名称
  75. data: 额外的表单数据
  76. headers: 自定义请求头
  77. Returns:
  78. Dict: 响应JSON数据
  79. Raises:
  80. requests.exceptions.RequestException: 请求失败时抛出
  81. """
  82. # 打开文件并构建files字典
  83. with open(file_path, 'rb') as f:
  84. files = {
  85. file_field_name: (file_path.split('/')[-1], f)
  86. }
  87. # 发送POST请求
  88. return self.post(endpoint, data=data, files=files, headers=headers)