44接口请求客户端
55基于httpx实现HTTP请求功能
66"""
7- import json
87import time
9- from typing import Any , Dict , List , Optional , Union
10-
118import httpx
12- from fastapi import HTTPException
9+ from typing import Any , Dict , Optional
1310from pydantic import BaseModel
1411
1512
@@ -39,27 +36,27 @@ class RequestResult(BaseModel):
3936
4037class HttpClient :
4138 """HTTP客户端"""
42-
39+
4340 def __init__ (self , options : RequestOptions = None ):
4441 """
4542 初始化HTTP客户端
4643
4744 :param options: 请求选项
4845 """
4946 self .options = options or RequestOptions ()
50-
47+
5148 async def request (
52- self ,
53- method : str ,
54- url : str ,
55- params : Dict [str , Any ] = None ,
56- headers : Dict [str , str ] = None ,
57- cookies : Dict [str , str ] = None ,
58- data : Dict [str , Any ] = None ,
59- json_data : Dict [str , Any ] = None ,
60- files : Dict [str , Any ] = None ,
61- auth : tuple = None ,
62- options : RequestOptions = None
49+ self ,
50+ method : str ,
51+ url : str ,
52+ params : Dict [str , Any ] = None ,
53+ headers : Dict [str , str ] = None ,
54+ cookies : Dict [str , str ] = None ,
55+ data : Dict [str , Any ] = None ,
56+ json_data : Dict [str , Any ] = None ,
57+ files : Dict [str , Any ] = None ,
58+ auth : tuple = None ,
59+ options : RequestOptions = None
6360 ) -> RequestResult :
6461 """
6562 发送HTTP请求
@@ -77,15 +74,15 @@ async def request(
7774 :return: 请求结果
7875 """
7976 opts = options or self .options
80-
77+
8178 # 准备客户端参数
8279 client_kwargs = {
8380 "timeout" : opts .timeout ,
8481 "verify" : opts .verify_ssl ,
8582 "follow_redirects" : opts .follow_redirects ,
8683 "max_redirects" : opts .max_redirects
8784 }
88-
85+
8986 # 准备请求参数
9087 request_kwargs = {
9188 "method" : method ,
@@ -98,15 +95,15 @@ async def request(
9895 "files" : files ,
9996 "auth" : auth
10097 }
101-
98+
10299 # 过滤None值
103100 request_kwargs = {k : v for k , v in request_kwargs .items () if v is not None }
104-
101+
105102 start_time = time .time ()
106103 error = None
107104 response = None
108105 retry_count = 0
109-
106+
110107 # 支持请求重试
111108 while retry_count <= opts .retry_count :
112109 try :
@@ -121,9 +118,9 @@ async def request(
121118 time .sleep (opts .retry_interval )
122119 else :
123120 break
124-
121+
125122 elapsed_time = (time .time () - start_time ) * 1000 # 转换为毫秒
126-
123+
127124 if response is None :
128125 # 请求失败,返回错误信息
129126 return RequestResult (
@@ -137,15 +134,15 @@ async def request(
137134 text = "" ,
138135 error = error
139136 )
140-
137+
141138 # 尝试解析JSON
142139 json_result = None
143140 try :
144141 if response .headers .get ('content-type' , '' ).startswith ('application/json' ):
145142 json_result = response .json ()
146143 except Exception :
147144 pass
148-
145+
149146 # 构建结果
150147 result = RequestResult (
151148 url = str (response .url ),
@@ -158,7 +155,7 @@ async def request(
158155 text = response .text ,
159156 json_data = json_result
160157 )
161-
158+
162159 return result
163160
164161
@@ -167,16 +164,16 @@ async def request(
167164
168165
169166async def send_request (
170- method : str ,
171- url : str ,
172- params : Dict [str , Any ] = None ,
173- headers : Dict [str , str ] = None ,
174- cookies : Dict [str , str ] = None ,
175- data : Dict [str , Any ] = None ,
176- json_data : Dict [str , Any ] = None ,
177- files : Dict [str , Any ] = None ,
178- auth : tuple = None ,
179- options : RequestOptions = None
167+ method : str ,
168+ url : str ,
169+ params : Dict [str , Any ] = None ,
170+ headers : Dict [str , str ] = None ,
171+ cookies : Dict [str , str ] = None ,
172+ data : Dict [str , Any ] = None ,
173+ json_data : Dict [str , Any ] = None ,
174+ files : Dict [str , Any ] = None ,
175+ auth : tuple = None ,
176+ options : RequestOptions = None
180177) -> RequestResult :
181178 """
182179 使用默认客户端发送请求的辅助函数
@@ -204,4 +201,4 @@ async def send_request(
204201 files = files ,
205202 auth = auth ,
206203 options = options
207- )
204+ )
0 commit comments