def web_request( self, method, url, body=None, header=None, auth=None ):
try:
if body:
# 创建一个连接池的实例
http = urllib3.PoolManager(retries=3,timeout=10,num_pools=200,maxsize=200)
# 1.retry: 重试重定向次数, 默认次数为3次, 如果想要关闭重定向, 但是不想关闭重试只需redirect = Flase, 如果重定向重试都关闭, retries = False
# 2.timeout: 超时, 可以设置链接超时和读超时
# timeout = urllib3.Timeout(connect=1, read=2)
# 3.numpools: 池子的数量, 假如有10个池子, 当你访问第11个ip的时候第一个池子会被干掉, 然后建一个
# 新的供第11个使用.一个池子是作用于同一个ip下的, 即
# http: // aaa.com / a
# 和http: // aaa.com / b是会共用一个池子的
# 4.maxsize: 一个池子缓存的最大连接数量.没有超过最大链接数量的链接都会被保存下来.在block为false的情况下,
# 添加的额外的链接不会被保存一般多用于多线程之下, 一般情况是设置为和线程数相等的数量, 保证每个线程都能访问一个链接.
# 5.还有一个参数是block, 默认为False, 如果线程数量大于池子最大链接数量.这时设置block为true, 则会阻塞线程, 因为线程会等其他线程使用完链接,
# 如果设置为False, 则不会阻塞线程, 但是会新开一个链接.有一个弊端是, 使用完之后这个链接会关闭, 所以如果
# 多线程经常建立链接会影响性能, 多占用多余的资源
# 创建一个请求
response = http.request(method=method,
url=url,
body=body,
headers={'Content-Type': 'application/json',
'Authorization': auth})
# 如果是GET,HEAD,DELETE请求,你还可以添加url的参数进去
# res = http.request("GET","http://www.baidu.com",fields={"key":"value"})
# 如果有中文,get方法会自动的将url转义(urlencode方法)
# 如果是POST请求,想要给url传递参数,就必须自己进行url转义
# res = http.request("POST","http://www.baidu.com?"+urlencode({"key":"value"}))
else:
response = urllib3.PoolManager().request(method=method,
url=url,
headers={'Content-Type': 'application/json',
'Authorization': auth})
if response.status == 200 and response.data:
try:
result = json.loads(response.data)
return result
except Exception as e:
logging.info(f'response data {response.data} is not json format', exc_info=True)
return response.data
except Exception:
logging.error(f'error in web_request method:{method} url:{url} body:{body}')
return None