从0开始python学习-42.requsts统一请求封装

news2024/12/23 12:48:56

统一请求封装的目的:

1.去除重复的冗余的代码

2. 跨py文件实现通过一个sess来自动关联有cookie关联的接口。

3. 设置统一的公共参数,统一的文件处理,统一的异常处理,统一的日志监控,统一的用例校验等

封装前原本代码:

py文件一:

class TestShop:
    session = requests.session()

    def test_start_list(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            'application':'app',
            'application_client_type':'h5',
            's':'index/index'
        }
        res = TestShop.session.request(method=method,url=url,params=params)
        print(res.json())

    def test_product_detail(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            'application':'app',
            'application_client_type':'h5',
            's':'goods/detail'
        }
        json = {
            "goods_id": "12"
            }
        res = TestShop.session.request(method=method,url=url,params=params,json=json)
        print(res.json())

py文件二:

class TestApi:
    access_token = ''
    session = requests.session()  
    def test_phpwind(self):
        url = 'http://47.107.116.139/phpwind/'
        res = TestApi.session.request(method="get",url=url)

        res_token = re.search('name="access_token" value="(.*?)"',res.text)
        TestApi.access_token = access_token.group(1)
        print(TestApi.access_token)
        
def test_file_upload(self):
    url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'
    params = {
        'access_token':TestApi.access_token
    }

    # 封装前文件上传
    file = {
        'media':open('D:\\1.jpg','rb')
    }
    res = RequestUtil().send_request(method="post", url=url, params=params, files=file)
    print(res.json())

从这两个代码可以看出,两个py文件都创建了session回话,且在第一个py文件中有params的冗余部分,则可以将请求统一封装到一个session进行调用,去除的冗余的同时,若params内容需要修改也只用修改一个即可,并且将文件上传进行封装后代码中只需要上传文件路径即可

虽然在公共参数中的public_params只作用于一个py文件,但是对于另外一个文件虽然多余了但是不会产生影响

统一封装请求:

class RequestUtil:

    session = requests.session()
    def send_request(self,**kwargs):

        # 公共参数
        public_params = {
            'application': 'app',
            'application_client_type': 'h5'
        }
        for key,value in kwargs.items():
            if key == "params":
                kwargs['params'].update(public_params)
            if key =='files':
                # 此时请求接口中的file的值为value.items(),可能会有多个文件,所以是一个列表
                for file_key,file_value in value.items():
                    # 文件上传中的key则为value[file_key],value为file_value
                    value[file_key] = open(file_value,'rb')

        # 公共请求
        res = RequestUtil.session.request(**kwargs)
        return res

修改后代码一:

class TestShop:
    token = ''

    #首页列表接口
    def test_start_list(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            's':'index/index'
        }
        res = RequestUtil().send_request(method=method,url=url,params=params)
        print(res.json())


    # 商品列表接口
    def test_product_detail(self):
        method = 'post'
        url = 'http://101.34.221.219:8010/api.php'
        params = {
            's':'goods/detail'
        }
        json = {
            "goods_id": "12"
            }
        res = RequestUtil().send_request(method=method,url=url,params=params,json=json)
        print(res.json())

修改后代码二:

class TestApi:
    access_token = ''
    def test_phpwind(self):
        url = 'http://47.107.116.139/phpwind/'
        res = RequestUtil().send_request(method="get",url=url)
        # print(res.text)

        # 因为token是在文本中,通过正则表达式的方式获取token
        access_token = re.search('name="access_token" value="(.*?)"',res.text)
        TestApi.access_token = res_token.group(1)
        print(TestApi.csrf_token)
        
def test_file_upload(self):
    url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'
    params = {
        'access_token':TestApi.access_token
    }

    # 封装后文件上传,只需要写入路径
    file = {
        'media':'D:\\1.jpg'
        }
    res = RequestUtil().send_request(method="post", url=url, params=params, files=file)
    print(res.json())

 文件上传封装:

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

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

相关文章

案例093:基于微信小程序的南宁周边乡村游设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

Redis——centos7环境安装Redis6.2.14版本,make命令编译时报错:jemalloc/jemalloc.h:没有那个文件或目录

一、报错原因 在redis-6.2.14文件夹下有一个README.md文件,有如下一段话: 在构建 Redis 时,通过设置 MALLOC 环境变量来选择非默认的内存分配器。Redis 默认编译并链接到 libc malloc,但在 Linux 系统上,jemalloc 是…

如何实现安卓端与苹果端互通的多种方案

随着移动设备用户的爆炸性增长,跨平台应用开发变得尤为重要。在Android与iOS之间实现互通对于推广应用、增加用户覆盖面和提升用户体验有至关重要的作用。以下是实现Android与iOS互通的多种方案,以及每种方案的实现方法、细节注意点、适合团队的规模和建…

AWS EKS1.26+kubesphere3.4.1

1、前提准备 1台EC2服务器Amazon Linux2,设置admin的角色 安装 aws cli V2 ​ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/installexport PATH/usr/local/bin:$PATHsou…

OpenHarmony鸿蒙源码下载编译和开发环境搭建

目录 一、开发环境搭建和源码下载二、编译三、总结 一、开发环境搭建 最好是在如Ubuntu18.04以上的系统中搭建,不然有些软件依赖需要解决,加大搭建时间 如gitee中开源OpenHarmony中的文档所示,搭建开发环境,搭建文档网站如下&a…

【算法设计与分析】分治-时间复杂度计算

目录 主定理 Master Theorem分治算法运行时间的递归表示主定理的简化形式 主定理的一般形式 递归树 Recursion Tree递归树的简单结论 主定理 Master Theorem 分治算法运行时间的递归表示 将原问题分解成 a 个子问题递归求解,每个子问题的规模是原问题的 1/b。同时子…

Unity游戏内相机(主角头部视角)的旋转问题:“万向节锁定”(Gimbal Lock)

前言: 在Unity中,相机的正前方是Z正半轴,相机的正右方是X正半轴,相机的正上方是Y正半轴。这个很好理解。 现在,我想要相机看向左前上方45,你会觉得要怎么做呢? 如果是我的话,我的第一…

在VM下使用Composer完成快照方式的软件制作

Composer允许您构建软件、应用程序、偏好设置文件或是文档的安装包,安装包可以部署到远程电脑或是作为镜像流程的一部分。构建软件包的第一步就是创建包源,根据要打包的软件,Composer允许您监视软件的安装和使用驱动器上已存在的文件来创建包…

Linux的top命令

通过top命令可以查看CPU、内存使用情况 -p:只显示某个进程的信息 -d:设置刷新时间 -c:显示产生进程的完整命令,默认是进程名 -n:指定刷新次数 -u:查找特点用户启动的进程 -b:以非交互非全…

【数据结构】八大排序之快速排序算法

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.快速排序简介及思路 二.快速排序代码实现的三种方式 📌左右交换法 📌挖坑填坑法 📌前后指针法 三.快速排序的时间复杂度分析…

MvvmToolkit的使用

背景:MvvmLight不更新了,用Toolkit代替 1、首先下载好社区版本的NuGet包 2、ViewModel中需要继承ObservableObject,查看ObservableObject可以看到里面有实现好InotifyPropertyChanged。 3、对于属性的set,可以简写成一行&#xff…

网络名称解读 -入门5

WAN: Wide Area Network(跨区域),LAN: Local Area NetworkWAN MAC, 用来连接上级网络, LAN MAC, 用于内部网路。 LAN & WAN 3.1,LAN表示子网,通过掩码来筛选子网内主机数量&…

【动态规划】【字符串】C++算法:140单词拆分

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 字符串 LeetCode140:单词拆分 II 给定一个字符串 s 和一个字符串字典 wordDict ,在字符串 s 中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序 返回…

创建专业电子邮件签名:提升个人与品牌形象的实用指南

电子邮件签名乃是品牌建设中常被忽略的一环。试想一下,若名片只是普通的、手工切割的复印纸,上面用黑体打印着你的联系方式,那将是多么平凡无奇。这将显得廉价、乏味且不专业——这正是人们不愿如此的原因。相反,他们渴望让自己的…

MySQL-DDL

DDL是数据定义语言,用来定义数据对象(数据库,表,字段) 数据库操作: 1.查询: 查询所有数据库:SHOW DATABASES; 查询当前数据库:SELECT DATABASE(); 2.创建: C…

彻底解决vue-video-player视频铺满div

需求 最近需要接入海康视频摄像头,然后把视频的画面接入到自己的网站系统中。以前对接过rtsp固定IP的显示视频,这次的不一样,没有了固定IP。海康的解决办法是,摄像头通过配置服务器到萤石云平台,然后购买企业版账号和…

编程语言的未来?直观点5年之际!

编程语言的未来?未来5年应该如何发展! 随着科技的飞速发展,编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心,为程序员提供了与机器沟通的桥梁。那么,在技术不断进步的未来,编程语言的走…

selenium实现UI自动化

1.selenium简介 selenium是支持web浏览器自动化的一系列工具和库的综合项目。具有支持linux、windows等多个平台,支持Firefox、chrome等多种主流浏览器;支持Java、Python等多种语言。 主要包括的三大工具有: WebDriver(rc 1.0)、…

优雅永不过时: spring-retry 重试框架

文章目录 前言一、幂等性是重试的前提二、使用步骤1.引入依赖2.启动类或配置类上添加EnableRetry,启用retry框架3.创建一个要重试的方法4.自定义一个retry监听5.创建一个测试类 总结 前言 Spring Retry 是一个用于在 Spring 应用中实现重试机制的库。它提供了一种方便的方式来…

AOP(面向切面编程)基于XML方式配置

概念解释:(理解基本概念方可快速入手) 连接点(joinpoint) 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法。 切入点(pointcut&#x…