python对于requests的封装方法详解

作者:可昌 时间:2023-02-06 15:29:48 

由于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

标签:python,requests,封装
0
投稿

猜你喜欢

  • 如何用我的国际域名做虚拟域名?

    2010-06-16 09:53:00
  • 关于设计品质保证(DQA)的几点想法

    2007-11-16 16:55:00
  • mysql定时自动备份数据库的方法步骤

    2024-01-15 10:01:19
  • 如何在vue中使用ant-design-vue组件

    2024-05-02 16:32:47
  • javascript 网站常用的iframe分割

    2023-08-19 09:27:58
  • SQL Server中统计每个表行数的快速方法

    2024-01-19 08:51:21
  • python使用pymongo操作mongo的完整步骤

    2023-07-12 20:31:21
  • ORACLE常见错误代码的分析与解决(三)

    2010-07-31 12:45:00
  • 登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法

    2024-01-23 00:13:38
  • 通过备份记录获取数据库的增长情况

    2024-01-17 20:21:26
  • mysql分表分库的应用场景和设计方式

    2024-01-22 05:49:39
  • 解决Node.js mysql客户端不支持认证协议引发的问题

    2024-01-23 18:16:13
  • 如何使用索引提高查询速度

    2024-01-15 02:14:15
  • axios发送post请求springMVC接收不到参数的解决方法

    2023-07-02 16:59:05
  • 如何获取numpy array前N个最大值

    2022-02-08 18:48:28
  • 细化解析:MySQL 搜索中的大小写敏感性

    2008-11-27 15:53:00
  • python 数据提取及拆分的实现代码

    2023-11-13 09:13:12
  • Python执行Linux系统命令的4种方法

    2023-08-10 19:04:50
  • Python人工智能之波士顿房价数据分析

    2021-09-23 19:43:35
  • Python语言描述KNN算法与Kd树

    2021-07-24 05:10:35
  • asp之家 网络编程 m.aspxhome.com