python对于requests的封装方法详解
作者:可昌 发布时间:2023-02-06 15:29:48
标签:python,requests,封装
由于requests是http类接口的核心,因此封装 * 虑问题比较多:
1. 对多种接口类型的支持;
2. 连接异常时能够重连;
3. 并发处理的选择;
4. 使用方便,容易维护;
当前并未全部实现,后期会不断完善。重点提一下并发处理的选择:python的并发处理机制由于存在GIL的原因,实现起来并不是很理想,综合考虑多进程、多线程、协程,在不考虑大并发性能测试的前提下使用了多线程-线程池的形式实现。使用的是
concurrent.futures模块。当前仅方便支持webservice接口。
# -*- coding:utf-8 -*-
import requests
from concurrent.futures import ThreadPoolExecutor
from Tools.Config import Config # 配置文件读取
from Tools.Log import Log # 日志管理
from Tools.tools import decoLOG # 日志装饰
'''
功能: Requests类
使用方法:
作者: 郭可昌
作成时间: 20180224
更新内容:
更新时间:
'''
class Requests(object):
def __init__(self):
self.session = requests.session()
self.header = {}
# URL默认来源于配置文件,方便不同测试环境的切换,也可以动态设定
self.URL = Config().getURL()
# 默认60s,可以动态设定
self.timeout = 60
#http连接异常的场合,重新连接的次数,默认为3,可以动态设定
self.iRetryNum = 3
self.errorMsg = ""
# 内容 = {用例编号:响应数据}
self.responses = {}
# 内容 = {用例编号:异常信息}
self.resErr={}
# 原始post使用保留
# bodyData: request's data
@decoLOG
def post(self, bodyData):
response = None
self.errorMsg = ""
try:
response = self.session.post(self.URL, data=bodyData.encode('utf-8'), headers=self.header, timeout=self.timeout)
response.raise_for_status()
except Exception as e:
self.errorMsg = str(e)
Log().logger.error("HTTP请求异常,异常信息:%s" % self.errorMsg)
return response
# 复数请求并发处理,采用线程池的形式,用例数>线程池的容量:线程池的容量为并发数,否则,用例数为并发数
# dicDatas: {用例编号:用例数据}
@decoLOG
def req_all(self, dicDatas, iThreadNum=5):
if len(dict(dicDatas)) < 1:
Log().logger.error("没有测试对象,请确认后再尝试。。。")
return self.responses.clear()
# 请求用例集合转换(用例编号,用例数据)
seed = [i for i in dicDatas.items()]
self.responses.clear()
# 线程池并发执行,iThreadNum为并发数
with ThreadPoolExecutor(iThreadNum) as executor:
executor.map(self.req_single,seed)
# 返回所有请求的响应信息({用例编号:响应数据}),http连接异常:对应None
return self.responses
# 用于单用例提交,http连接失败可以重新连接,最大重新连接数可以动态设定
def req_single(self, listData, reqType="post", iLoop=1):
response = None
# 如果达到最大重连次数,连接后提交结束
if iLoop == self.iRetryNum:
if reqType == "post":
try:
response = requests.post(self.URL, data=listData[1].encode('utf-8'), headers=self.header,
timeout=self.timeout)
response.raise_for_status()
except Exception as e:
# 异常信息保存只在最大连接次数时进行,未达到最大连接次数,异常信息为空
self.resErr[listData[0]] = str(e)
Log().logger.error("HTTP请求异常,异常信息:%s【%d】" % (str(e), iLoop))
self.responses[listData[0]] = response
else:
# for future: other request method expand
pass
# 未达到最大连接数,如果出现异常,则重新连接尝试
else:
if reqType == "post":
try:
response = requests.post(self.URL, data=listData[1].encode('utf-8'), headers=self.header,
timeout=self.timeout)
response.raise_for_status()
except Exception as e:
Log().logger.error("HTTP请求异常,异常信息:%s【%d】" % (str(e), iLoop))
# 重连次数递增
iLoop += 1
# 进行重新连接
self.req_single(listData, reqType, iLoop)
# 当前连接终止
return None
self.responses[listData[0]] = response
else:
# for future: other request method expand
pass
# 设定SoapAction, 快捷完成webservice接口header设定
def setSoapAction(self, soapAction):
self.header["SOAPAction"] = soapAction
self.header["Content-Type"] = "text/xml;charset=UTF-8"
self.header["Connection"] = "Keep-Alive"
self.header["User-Agent"] = "InterfaceAutoTest-run"
来源:https://blog.csdn.net/fatalxx/article/details/79384056


猜你喜欢
- CSV 是一种简单的数据格式,通常为电子表格软件所使用。 它主要是由一系列的表格行组成,每行中单元格之间使用逗号(CSV 是 逗号分隔数值(
- 技巧问题 Mysql的远程连接出现"Lost connection to MySQL server during query&qu
- 前言之前在使用包括大型文档(商汤科技、百度飞浆)代码的时候都一直使用 pip install -v -e . ,这一命令,但是一直不是很清楚
- 文件操作1#文件操作流程:1、打开文件,得到一个文件句柄;通过文件句柄操作文件;关闭文件。#将文件打开文件赋给file1,test_file
- 阅读目录什么是PrmoisePromise的使用最近在看《你不知道的javascript中卷》,发觉作者花了基本一半的篇幅去讲异步和prom
- 1、if条件选择# coding:utf-8num = 23if num>2:print("dayu")if nu
- 我就废话不多说了,大家还是直接看代码吧~func main() { var a chan string a =mak
- 本文实例讲述了PHP商品秒杀问题解决方案。分享给大家供大家参考,具体如下:引言假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量。
- 大致介绍在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。接口例子: function p
- Django测试框架非常简单,首选方法是使用python标准库中的unittest模块。Writing testsDjango的单元测试使用
- 引言图形包括线条、圆形、椭圆形、多边形等。在skimage包中,绘制图形用的是draw模块,不要和绘制图像搞混了。1、画线条函数调用格式为:
- 题目:1. 利用拉格朗日乘子法#导入sympy包,用于求导,方程组求解等等from sympy import * #设置变量x1 = sym
- 环境 django 1.10.6缘起今天接到一个任务——解决终端满屏日志中的无用错误。 django 会尽可能给你准确报出错误位置,但是一些
- 富文本-图片上传html:<div class="layui-form-item layui-form-text"
- 本文介绍了layer弹出子iframe层父子页面传值的实现方法,分享给大家,具体如下:父页面获取子页面元素格式:$("#ifram
- 谈到比特币,我们都知道挖矿,有些人并不太明白挖矿的含义。这里的挖矿其实就是哈希的碰撞,举个简单例子:import hashlibx = 11
- 本文实例为大家分享了微信小程序支付前端源码,供大家参考,具体内容如下//index.jsPage({ data: {}, //点击支付按钮进
- 插入或更新null空值一、在SQL语句中直接插入null或空字符串“”int? item = nul
- 如下所示:1.条件判断2.内置函数abs()3.内置模块 math.fabsabs() 与fabs()的区别abs()是一个内置函数,而fa
- 1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限解决方法 :给予权限,执行 “chown -R m