Python接口自动化之request请求封装源码分析

目录
  • 1. 源码分析
  • 2. requests请求封装
  • 3. 总结

前言:

我们在做自动化测试的时候,大家都是希望自己写的代码越简洁越好,代码重复量越少越好。那么,我们可以考虑将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认证,可将certverify两个参数去掉。

3. 总结

本文简单的介绍了Python接口自动化之request请求封装

到此这篇关于Python接口自动化之request请求封装源码分析的文章就介绍到这了,更多相关Python request 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python爬虫使用requests发送post请求示例详解

    简介 HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式.服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析.具体的编码方式包括: application/x-www-form-urlencoded 最常见post提交数据的方式,以form表单形式提交数据. application/json 以json串提交数据. multipart/form-data 一般使用来上传文件. 一. 以f

  • python 实现Requests发送带cookies的请求

    一.缘 起 最近学习[悠悠课堂]的接口自动化教程,文中提到Requests发送带cookies请求的方法,笔者随之也将其用于手头实际项目中,大致如下 二.背 景 实际需求是监控平台侧下发消息有无异常,如有异常便触发报警推送邮件,项目中下发消息接口需要带cookies 三.说 明 脚本的工程名为ynJxhdSendMsg,大致结构如下图 sendMsg.py为主程序,函数checkMsg为在已发消息列表中查找已下发消息,函数sendMsg为发消息并根据结果返回对应的标识 sendAlertEmai

  • 详解python requests中的post请求的参数问题

    问题:最新在爬取某站点的时候,发现在post请求当中,参数构造正确却获取不到数据,索性将post的参数urlencode之后放到post请求的url后面变成get请求,结果成功获取到数据,对此展开疑问. 1.http请求中Form Data和Request Playload的区别: Ajax post请求中常用的两种参数形式:form data 和 request payload get请求的时候,我们的参数直接反映在url里面,为key1=value1&key2=value2形式,如果是pos

  • Python接口自动化之浅析requests模块get请求

    一.requests模块说明 介绍 Requests是Python语言的第三方的库,专门用于发送HTTP请求. 特点 1.Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码. 2.在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作. 3.Requests会自动实现持久连接keep-alive

  • python中requests模拟登录的三种方式(携带cookie/session进行请求网站)

    一,cookie和session的区别 cookie在客户的浏览器上,session存在服务器上 cookie是不安全的,且有失效时间 session是在cookie的基础上,服务端设置session时会向浏览器发送设置一个设置cookie的请求,这个cookie包括session的id当访问服务端时带上这个session_id就可以获取到用户保存在服务端对应的session 二,爬虫处理cookie和session 带上cookie和session的好处: 能够请求到登录后的界面 带上cook

  • Python接口自动化浅析requests请求封装原理

    目录 以下主要介绍如何封装请求 将常用的get.post请求封装起来 get请求源码: post请求源码: 再来研究下request源码: 直接调用request函数 在上一篇Python接口自动化测试系列文章:Python接口自动化浅析Token应用原理,介绍token基本概念.运行原理及在自动化中接口如何携带token进行访问. 以下主要介绍如何封装请求 还记得我们之前写的get请求.post请求么? 大家应该有体会,每个请求类型都写成单独的函数,代码复用性不强. 接下来将请求类型都封装起来

  • python 包 requests 实现请求操作

    目录 一.安装 二.请求类型 三.带参数请求 四.自定义headers 五.请求属性 六.文件上传 七.会话维持 八.证书验证 九.代理设置 十.超时设置 十一.认证设置 十二.异常处理 一.安装 pip install requests 二.请求类型 import requests requests.get('https://www.baidu.com') requests.post('https://www.baidu.com') requests.put('https://www.baid

  • Python接口自动化之request请求封装源码分析

    目录 1. 源码分析 2. requests请求封装 3. 总结 前言: 我们在做自动化测试的时候,大家都是希望自己写的代码越简洁越好,代码重复量越少越好.那么,我们可以考虑将request的请求类型(如:Get.Post.Delect请求)都封装起来.这样,我们在编写用例的时候就可以直接进行请求了. 1. 源码分析 我们先来看一下Get.Post.Delect等请求的源码,看一下它们都有什么特点. (1)Get请求源码 def get(self, url, **kwargs): r""

  • Python接口自动化浅析登录接口测试实战

    目录 1.什么是接口? 那么,接口测试和功能测试的区别在哪呢? 2.如何开展接口测试? 3.如何设计接口用例? 1.获取接口文档 Fiddler 2.分析接口文档的接口,提取测试点 3.接口测试用例设计思路 4.接口测试其他范围 接口业务测试 接口的性能测试 接口安全测试 在项目下新建一个文件夹common 编写登录接口用例,调用封装的请求类. 对于用例的一些总结: 4.接口测试用例实战 在上一篇Python接口自动化测试系列文章:Python接口自动化浅析unittest单元测试原理,主要介绍

  • Python接口自动化浅析unittest单元测试原理

    目录 一.单元测试三连问 1.什么是单元测试? 2.为什么要做单元测试? 3.怎么做单元测试? 二.unittest模块说明 1.unittest简介 2.unittest组成 1.TestCase(测试用例): 2.TestSuite(测试套件): 3.TestLoader(测试用例加载器): 4.TextTestRunner(执行测试用例): 5.Test Fixture(测试环境数据准备和清理): 3.unittest核心工作原理 三.unittest单元测试 1.实现思路 2.使用介绍

  • Django drf请求模块源码解析

    DRF 框架,全称为 Django Rest Framework,是 Django 内置模块的扩展,用于创建标准化 RESTful API:它利用 ORM 映射数据库,并自定义序列化数据进行返回,多用于前后端分离项目 项目地址: https://github.com/encode/django-rest-framework 请求模块:request对象 源码入口 APIView类中dispatch方法中的:request=self.iniialize_request(*args, **kwarg

  • Python接口自动化之浅析requests模块post请求

    在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块.get请求及响应结果详解.接下来介绍requests模块中的post请求的使用. 一.源码解析 def post(url, data=None, json=None, **kwargs): r"""Sends a POST request. :param url: URL for the new :class:`Request` object.

  • Python接口自动化浅析logging封装及实战操作

    在上一篇Python接口自动化测试系列文章:Python接口自动化浅析logging日志原理及模块操作流程,主要介绍日志相关概念及logging日志模块的操作流程. 而在此之前介绍过yaml封装,数据驱动.配置文件.日志文件等独立的功能,我们将这些串联起来,形成一个完整的接口测试流程. 以下主要介绍将logging常用配置放入yaml配置文件.logging日志封装及结合登录用例讲解日志如何在接口测试中运用. 一.yaml配置文件 将日志中的常用配置,比如日志器名称.日志器等级及格式化放在配置文

  • python接口自动化如何封装获取常量的类

    这篇文章主要介绍了python接口自动化如何封装获取常量的类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景: 一.执行case的过程: 首先需要,我们能够通过excel获取单元格的内容.获取内容时,首先需要知道获取的数据是哪一行的,这行数据中需要拿那些参数,比如case 名称.请求url.请求方式.header.依赖id.依赖数据所属字段.请求数据.预期结果: 然后需要,判断字段.数据的合法性,将合法case组合成接口请求: 最后需要,执

  • python接口自动化使用requests库发送http请求

    目录 前言 一.requests库 二.HTTP 请求方法 三.发送GET请求 四.发送POST请求 五.获取响应数据 六.高级操作 6.1文件下载 6.2文件上传 6.3SSL证书验证 6.4保持会话 6.5requests封装 总结 前言 今天笔者想和大家来聊聊python接口自动化如何使用requests库发送http请求,废话呢笔者就不多说了,直接进入正题. 一.requests库 什么是Requests ?Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2

随机推荐