Python接口自动化之request请求封装

news2024/12/23 17:32:21

我们在做自动化测试的时候,大家都是希望自己写的代码越简洁越好,代码重复量越少越好。那么,我们可以考虑将request的请求类型(如:Get、Post、Delect请求)都封装起来。这样,我们在编写用例的时候就可以直接进行请求了。

1. 源码分析

我们先来看一下Get、Post、Delect等请求的源码,看一下它们都有什么特点。

(1)Get请求源码

 def get(self, url, **kwargs):
  r"""Sends a GET request. Returns :class:`Response` object.
  :param url: URL for the new :class:`Request` object.
     :param \*\*kwargs: Optional arguments that ``request`` takes.
     :rtype: requests.Response
      """
  
  kwargs.setdefault('allow_redirects', True)
  return self.request('GET', url, **kwargs) 

(2)Post请求源码

def post(self, url, data=None, json=None, **kwargs):
  r"""Sends a POST request. Returns :class:`Response` object.
  :param url: URL for the new :class:`Request` object.
     :param data: (optional) Dictionary, list of tuples, bytes, or file-like
  object to send in the body of the :class:`Request`.
  :param json: (optional) json to send in the body of the :class:`Request`.
  :param \*\*kwargs: Optional arguments that ``request`` takes.
  :rtype: requests.Response
  """
 
  return self.request('POST', url, data=data, json=json, **kwargs)  

(3)Delect请求源码

 def delete(self, url, **kwargs):
        r"""Sends a DELETE request. Returns :class:`Response` object.
        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        """
    
        return self.request('DELETE', url, **kwargs)

(4)分析结果

我们发现,不管是Get请求、还是Post请求或者是Delect请求,它们到最后返回的都是request函数。那么,我们再去看一看request函数的源码。

 def request(self, method, url,
         params=None, data=None, headers=None, cookies=None, files=None,
         auth=None, timeout=None, allow_redirects=True, proxies=None,
         hooks=None, stream=None, verify=None, cert=None, json=None):
     """Constructs a :class:`Request <Request>`, prepares it and sends it.
     Returns :class:`Response <Response>` object.
 
     :param method: method for the new :class:`Request` object.
     :param url: URL for the new :class:`Request` object.
     :param params: (optional) Dictionary or bytes to be sent in the query
         string for the :class:`Request`.
     :param data: (optional) Dictionary, list of tuples, bytes, or file-like
         object to send in the body of the :class:`Request`.
     :param json: (optional) json to send in the body of the
         :class:`Request`.
     :param headers: (optional) Dictionary of HTTP Headers to send with the
         :class:`Request`.
     :param cookies: (optional) Dict or CookieJar object to send with the
         :class:`Request`.
     :param files: (optional) Dictionary of ``'filename': file-like-objects``
         for multipart encoding upload.
     :param auth: (optional) Auth tuple or callable to enable
         Basic/Digest/Custom HTTP Auth.
     :param timeout: (optional) How long to wait for the server to send
         data before giving up, as a float, or a :ref:`(connect timeout,
         read timeout) <timeouts>` tuple.
     :type timeout: float or tuple
     :param allow_redirects: (optional) Set to True by default.
     :type allow_redirects: bool
     :param proxies: (optional) Dictionary mapping protocol or protocol and
         hostname to the URL of the proxy.
     :param stream: (optional) whether to immediately download the response
         content. Defaults to ``False``.
     :param verify: (optional) Either a boolean, in which case it controls whether we verify
         the server's TLS certificate, or a string, in which case it must be a path
         to a CA bundle to use. Defaults to ``True``.
     :param cert: (optional) if String, path to ssl client cert file (.pem).
         If Tuple, ('cert', 'key') pair.
     :rtype: requests.Response
     """
     # Create the Request.
     req = Request(
         method=method.upper(),
         url=url,
         headers=headers,
         files=files,
         data=data or {},
         json=json,
         params=params or {},
         auth=auth,
         cookies=cookies,
         hooks=hooks,
     )
     prep = self.prepare_request(req)
 
     proxies = proxies or {}
 
     settings = self.merge_environment_settings(
         prep.url, proxies, stream, verify, cert
     )
 
     # Send the request.
     send_kwargs = {
         'timeout': timeout,
         'allow_redirects': allow_redirects,
     }
     send_kwargs.update(settings)
     resp = self.send(prep, **send_kwargs)
 
     return resp    

从request源码可以看出,它先创建一个Request,然后将传过来的所有参数放在里面,再接着调用self.send(),并将Request传过去。这里我们将不在分析后面的send等方法的源码了,有兴趣的同学可以自行了解。

分析完源码之后发现,我们可以不需要单独在一个类中去定义Get、Post等其他方法,然后在单独调用request。其实,我们直接调用request即可。

2. requests请求封装

代码示例:

 import requests
 
 class RequestMain:
     def __init__(self):
         """
 
         session管理器
         requests.session(): 维持会话,跨请求的时候保存参数
         """
         # 实例化session
         self.session = requests.session()
 
     def request_main(self, method, url, params=None, data=None, json=None, headers=None, **kwargs):
         """
 
         :param method: 请求方式
         :param url: 请求地址
         :param params: 字典或bytes,作为参数增加到url中         
   :param data: data类型传参,字典、字节序列或文件对象,作为Request的内容
         :param json: json传参,作为Request的内容
         :param headers: 请求头,字典
         :param kwargs: 若还有其他的参数,使用可变参数字典形式进行传递
         :return:
         """
 
         # 对异常进行捕获
         try:
             """
             
             封装request请求,将请求方法、请求地址,请求参数、请求头等信息入参。
             注 :verify: True/False,默认为True,认证SSL证书开关;cert: 本地SSL证书。如果不需要ssl认证,可将这两个入参去掉
             """
             re_data = self.session.request(method, url, params=params, data=data, json=json, headers=headers, cert=(client_crt, client_key), verify=False, **kwargs)
         # 异常处理 报错显示具体信息
         except Exception as e:
             # 打印异常
             print("请求失败:{0}".format(e))
         # 返回响应结果
         return re_data


 if __name__ == '__main__':
     # 请求地址
     url = '请求地址'
     # 请求参数
     payload = {"请求参数"}
     # 请求头
     header = {"headers"}
     # 实例化 RequestMain()
     re = RequestMain()
     # 调用request_main,并将参数传过去
     request_data = re.request_main("请求方式", url, json=payload, headers=header)
     # 打印响应结果
     print(request_data.text)  

注 :如果你调的接口不需要SSL认证,可将cert与verify两个参数去掉。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末领取】


     【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图+全套资料】


一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战


四、App自动化项目实战

五、一线大厂简历


六、测试开发DevOps体系

七、常用自动化测试工具


八、JMeter性能测试

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OptaPlanner笔记2

1.5.3 使用maven 修改pom.xml 导入optaplanner-bom以避免为每一个依赖项重复添加版本号 <project>...<dependencyManagement><dependencies><dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-bom</art…

使用 CycleGAN 进行图像到图像转换

介绍 在人工智能和计算机视觉领域,CycleGAN 是一项非凡的创新,它重新定义了我们感知和操作图像的方式。这种尖端技术彻底改变了图像到图像的转换,实现了领域之间的无缝转换,例如将马变成斑马或将夏日风景变成雪景。在本文中,我们将揭开 CycleGAN 的魔力,并探索其在各个领…

微信小程序开发价格

小程序开发费用 小程序的开发费用是很多企业和个人在规划项目时需要重点考虑的一个方面。本文将从微信认证费、域名、服务器、程序开发费用、微信支付费率以及维护费用等多个角度为大家分析小程序开发费用的组成。 1. 微信认证费&#xff1a;作为小程序的一种信任凭证&#xf…

对文件的读取和修改 JAVA

目录 1、try catch:2、hasNextLine():3、java读取某个文件夹信息&#xff1a;4、修改&#xff1a; 1、try catch: 1、try语句对你觉得可能会有问题的语句进行尝试 2、try内语句出现错误会被catch语句捕捉&#xff0c;且整个程序不会崩溃 3、try语句出错才会执行下方catch语句…

机器学习实战4-数据预处理

文章目录 数据无量纲化preprocessing.MinMaxScaler&#xff08;归一化&#xff09;导库归一化另一种写法将归一化的结果逆转 preprocessing.StandardScaler(标准化)导库实例化查看属性查看结果逆标准化 缺失值impute.SimpleImputer另一种填充写法 处理分类型特征&#xff1a;编…

C++ 学习系列3 -- 函数压栈与出栈

在C中&#xff0c;函数压栈&#xff08;函数调用&#xff09;和出栈&#xff08;函数返回&#xff09;是函数调用过程中的两个关键步骤。下面将逐步解释这两个过程&#xff1a; 一 函数压栈与出栈过程简介 函数压栈&#xff08;函数调用&#xff09;的过程如下&#xff1a; …

深入Python字典

在Python中&#xff0c;字典是通过哈希表实现的。也就是说&#xff0c;字典是一个数组&#xff0c;而数组的索引是键经过哈希函数处理后得到的。哈希函数的目的是使键均匀地分布在数组中。由于不同的键可能具有相同的哈希值&#xff0c;即可能出现冲突&#xff0c;高级的哈希函…

开封Geotrust单域名https证书推荐

Geotrust作为全球领先的数字证书颁发机构之一&#xff0c;拥有多年的数字证书颁发经验&#xff0c;其数字证书被广泛应用于电子商务、在线支付、企业通讯、云计算等领域&#xff0c;为用户提供了安全可靠的保障。而Geotrust旗下的单域名https证书是大多数客户创建网站时的选择之…

最容易理解的C51单片机4位密码锁示例代码(附proteus电路图)

说明&#xff1a;开机启动就是上图这样的&#xff0c;密码正确显示P&#xff08;pass&#xff09;,密码错误显示E&#xff08;error&#xff09; #include "reg51.h" #include "myheader.h" #define uchar unsigned char long int sleep_i0; int pwd[4]{0…

Linux 库文件——静态库和共享库

一、库文件的概念 库是一组预先编译好的方法&#xff08;.o文件&#xff09;的集合。Linux系统存储的库的位置一般在&#xff1a;/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在/usr/include 下或其子目录下。 库有两种&…

一个Demo搞定前后端大文件分片上传、断点续传、秒传

原文链接&#xff1a;https://juejin.cn/post/7266265543412351030 前言 文件上传在项目开发中再常见不过了&#xff0c;大多项目都会涉及到图片、音频、视频、文件的上传&#xff0c;通常简单的一个Form表单就可以上传小文件了&#xff0c;但是遇到大文件时比如1GB以上&…

Leetcode-每日一题【剑指 Offer 28. 对称的二叉树】

题目 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称…

利用三维内容编辑器制作VR交互课件,简单好用易上手

随着虚拟现实技术的不断发展&#xff0c;越来越多的教育机构开始尝试将其应用于教育教学中。然而&#xff0c;要实现这一目标并不容易&#xff0c;需要专业的技术支持和开发团队。 为了解决这一问题&#xff0c;广州华锐互动研发了三维内容编辑器&#xff0c;它是一种基于虚拟现…

13.3 目标检测和边界框

锚框的计算公式 假设原图的高为H,宽为W 详细公式推导 以同一个像素点为锚框&#xff0c;可以生成 (n个缩放 m个宽高比 -1 )个锚框 给训练集标注锚框 每个锚框包含的信息有&#xff1a;每个锚框的类别 和 偏移量。 偏移量指的是&#xff1a;真实边界相对于锚框的偏移量。 …

Android系统-ServiceManager1

目录 引言 概念 启动 流程图 main binder_open binder_become_context_manager binder_ioctl binder_ioctl_set_ctx_mgr binder_new_node binder_loop binder_write binder_ioctl binder_ioctl_write_read binder_thread_write binder_parse bio_init bio_in…

新鲜出炉的小工具,将Claude 100K转化为免费可用的OpenAI API

上个月转载了一篇文章&#xff0c;讲的就是刚刚发布的Claude 2.0&#xff0c;可以说是非常强大了&#xff1a;ChatGPT最强竞品Claude2来了&#xff1a;代码、GRE成绩超越GPT-4&#xff0c;免费可用 但是可惜的是&#xff0c;Claude虽然免费使用&#xff0c;但是不开放API给我们…

【uni-app】 .sync修饰符与$emit(update:xxx)实现数据双向绑定

最近在看uni-app文档&#xff0c;看到.sync修饰符的时候&#xff0c;觉得很有必要记录一下 其实uni-app是一个基于Vue.js和微信小程序开发框架的跨平台开发工具 所以经常会听到这样的说法&#xff0c;只要你会vue&#xff0c;uni-app就不难上手 在看文档的过程中&#xff0c;发…

邵阳人自己的民国风情街终于来了!随手一拍即是大片!

在邵阳这座美丽的城市&#xff0c;拥有许多非常有意思并且值得打卡的游玩景区&#xff0c;“丹霞之魂&#xff0c;国之瑰宝”的崀山、“南方呼伦贝尔”之称的高山苔地草原、被联合国誉为“神奇绿洲”的遂宁黄桑等等都是成都这座城市的代表&#xff0c;但在邵阳最有民国风情韵味…

【小吉带你学Git】讲解GitHub操作,码云操作,GitLab操作

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f33a;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;GitHub操作⭐安装GitHub插件⭐在idea中设置GitHub账号&…

完成图像反差处理

bmp图像的前54字节为图像头&#xff0c;第19个字节开始4字节为图像宽&#xff0c;第23字节开始4字节为图像高&#xff0c;图像大小为&#xff1a;972*720*3542099574&#xff0c;为宽*高*像素点头&#xff0c;如下&#xff1a; 图像的反差处理