python对于requests的封装方法详解


Posted in Python onJanuary 03, 2019

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

以上这篇python对于requests的封装方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python递归遍历列表及输出的实现方法
May 19 Python
python多维数组切片方法
Apr 13 Python
python读取文件名并改名字的实例
Jan 07 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
tensorflow如何批量读取图片
Aug 29 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
python由已知数组快速生成新数组的方法
Apr 08 Python
scrapy实践之翻页爬取的实现
Jan 05 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 Python
分享几种python 变量合并方法
Mar 20 Python
Python  序列化反序列化和异常处理的问题小结
Dec 24 Python
python使用suds调用webservice接口的方法
Jan 03 #Python
Python调用服务接口的实例
Jan 03 #Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 #Python
python requests 库请求带有文件参数的接口实例
Jan 03 #Python
Python图像处理之颜色的定义与使用分析
Jan 03 #Python
Python在图片中插入大量文字并且自动换行
Jan 02 #Python
python 输出所有大小写字母的方法
Jan 02 #Python
You might like
php常用文件操作函数汇总
2014/11/22 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
canvas的神奇用法
2017/02/03 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
webpack external模块的具体使用
2018/03/10 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
Python读写Json涉及到中文的处理方法
2016/09/12 Python
简述Python2与Python3的不同点
2018/01/21 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
python代码xml转txt实例
2020/03/10 Python
python 一维二维插值实例
2020/04/22 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
历史专业个人求职信分享
2013/12/20 职场文书
运动会演讲稿100字
2014/08/25 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
小学教师工作总结2015
2015/04/07 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
青年志愿者活动感想
2015/08/07 职场文书