记录request库的部分封装

仅供参考

github找的框架,基于他的代码做了一部分改动,下面着重代码的解析和一些其他的完善。记录下来主要用于后续自己再做改动。 

import requests
import json as complexjson
from common.logger import loggerclass RestClient():def __init__(self, api_root_url):self.api_root_url = api_root_urlself.session = requests.session()def get(self, url, **kwargs):return self.request(url, "GET", **kwargs)def post(self, url, data=None, json=None,files=None, **kwargs):if files is not None:return self.request(url, "POST", data=data,files=files, **kwargs)else:return self.request(url, "POST", data=data, json=json,**kwargs)def put(self, url, data=None, **kwargs):return self.request(url, "PUT", data, **kwargs)def delete(self, url, **kwargs):return self.request(url, "DELETE", **kwargs)def patch(self, url, data=None, **kwargs):return self.request(url, "PATCH", data, **kwargs)def request(self, url, method, data=None, json=None,files=None, **kwargs):url = self.api_root_url + urlheaders = dict(**kwargs).get("headers")params = dict(**kwargs).get("params")#files = dict(**kwargs).get("params")cookies = dict(**kwargs).get("cookies")self.request_log(url, method, data, json, params, headers, files, cookies)if method == "GET":return self.session.get(url, **kwargs)if method == "POST":if files is not None:return self.session.post(url, data=data, files=files, **kwargs)else:return self.session.post(url, data=data, json=json, **kwargs)if method == "PUT":if json:# PUT 和 PATCH 中没有提供直接使用json参数的方法,因此需要用data来传入data = complexjson.dumps(json)return self.session.put(url, data, **kwargs)if method == "DELETE":return self.session.delete(url, **kwargs)if method == "PATCH":if json:data = complexjson.dumps(json)return self.session.patch(url, data, **kwargs)def request_log(self, url, method, data=None, json=None, params=None, headers=None, files=None, cookies=None,**kwargs):logger.info("接口请求地址 ==>> {}".format(url))logger.info("接口请求方式 ==>> {}".format(method))logger.info("接口请求头 ==>> {}".format(complexjson.dumps(headers, indent=4, ensure_ascii=False)))logger.info("接口请求 params 参数 ==>> {}".format(complexjson.dumps(params, indent=4, ensure_ascii=False)))logger.info("接口请求体 data 参数 ==>> {}".format(complexjson.dumps(data, indent=4, ensure_ascii=False) if data else 'None'))logger.info("接口请求体 json 参数 ==>> {}".format(complexjson.dumps(json, indent=4, ensure_ascii=False) if json else 'None'))if files:logger.info("接口上传附件 files 参数 ==>> {} (file names and types)".format([f for f in files.keys()]))else:logger.info("接口上传附件 files 参数 ==>> None")logger.info("接口 cookies 参数 ==>> {}".format(complexjson.dumps(cookies, indent=4, ensure_ascii=False) if cookies else 'None'))

定义了一个RestClient类,用于发送HTTP请求到指定的API根URL。该类支持GET、POST、PUT、DELETE和PATCH等HTTP方法。它使用requests库来发起请求,并提供了一个日志记录器来记录每次请求的详细信息。
__init__方法初始化RestClient实例,接受一个api_root_url参数,用于构造请求的完整URL。
get方法发送一个GET请求到指定的URL。
post方法发送一个POST请求到指定的URL,可以传入数据、JSON和文件。
put方法发送一个PUT请求到指定的URL,可以传入数据。
delete方法发送一个DELETE请求到指定的URL。
patch方法发送一个PATCH请求到指定的URL,可以传入数据。
request方法是上述所有HTTP方法的底层实现。它根据不同的HTTP方法构造请求,并使用session对象发送请求。该方法还支持传入额外的参数,如headers、params和cookies等。
request_log方法用于记录请求的详细信息,包括URL、HTTP方法、请求头、请求参数、请求体等。
总的来说,这个RestClient类提供了一个方便的方法来发送HTTP请求,并记录请求的详细信息,方便调试和监控。

后续接口的使用

class Register(RestClient):def __init__(self, api_root_url, **kwargs):super(Register, self).__init__(api_root_url, **kwargs)def register(self, **kwargs):"""执行注册操作。通过向“register”端点发送POST请求来实现用户注册。参数:**kwargs: 动态接收传入的关键字参数,这些参数将被添加到POST请求的数据中。返回值:发送POST请求后的响应对象。具体的响应内容依赖于后端的实现。"""return self.post("/register", **kwargs)

这里的super(Register, self).__init__(api_root_url, **kwargs)的作用是确保Register类的实例在创建时,不仅设置了自己的属性(如果有的话),还正确地初始化了从RestClient继承来的所有属性和进行了必要的配置设置。通过**kwargs,可以灵活地向RestClient的构造函数传递任何额外的配置信息,增强了类的灵活性和重用性。

 

1.对于非cookie和sessionid的系统,比如token的管理

import requests# 创建Session实例
session = requests.Session()# 设置Token(这里以Bearer Token为例)
token = "your_token_here"
session.headers.update({"Authorization": f"Bearer {token}"})# 现在,任何通过这个session实例发出的请求都会自动包含Authorization头
response = session.get("https://api.example.com/data")# 打印响应内容
print(response.text)

考虑在request中加入变量,根据变量值区分是否需要自动更新headers。其中Authorization是项目中用于校验的token。

下面是对于这部分代码的解读。通过session.headers.update()方法添加了一个自定义的请求头——Authorization,其值为Bearer {token},这里Bearer是一种常见的Token认证方案的类型,后面跟着的是实际的Token字符串。这样设置后,通过这个session发出的所有请求都会自动在请求头中包含这个Token信息,实现认证目的。

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

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

相关文章

WebMvcConfigurer配置不当导致鉴权失败

最近同事说他们有个新需求,需要对接口进行加解密,所以他给项目配置了一个拦截器,但这个拦截器直接导致了每个接口鉴权失败,每次调用接口都是提示没有session信息。 公司内的所有java项目是公用同一套基础依赖,所以我也…

蚂蚁分类信息系统二开仿么么街货源客模板微商货源网源码(带手机版)

源码介绍 网站采用蚂蚁分类信息系统二次开发,模板仿么么街货源客模板,微商货源网定制版。 模板设计风格简洁,分类信息采用列表形式发布,这种设计方式非常符合度娘 SEO 规则。收录效果是杠杠的。 这个网站风格目前是用来做货源推…

cuda-cuda语法

1、cuda::unique_ptr<float[]> cuda::unique_ptr<float[]>是一个C中的智能指针类型&#xff0c;用于管理在CUDA中分配的内存。这种类型的智能指针通常用于自动释放或管理内存&#xff0c;避免内存泄漏。cuda::unique_ptr<float[]>表示它是一个唯一拥有的指针…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【一】

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

uniapp如何实现跳转

在 UniApp 中&#xff0c;页面跳转主要可以通过两种方式实现&#xff1a;使用 <navigator> 组件和调用 UniApp 提供的导航 API。以下是这两种方式的详细说明&#xff1a; 1. 使用 <navigator> 组件 <navigator> 组件允许你在页面上创建一个可点击的元素&am…

ArcGIS Pro SDK (三)Addin控件 4 工程项目结构类

25 ArcGIS Pro 自定义项目 目录 25 ArcGIS Pro 自定义项目25.1 添加控件25.2 Code26 ArcGIS Pro 自定义工程项目26.1 添加控件26.2 Code25.1 添加控件 25.2 Code ProCustomItemTest.cs using ArcGIS.Desktop.Core; using ArcGIS.Desktop

分布式文件存储 - - - MinIO从入门到飞翔

MinIO从入门到飞翔 文章目录 MinIO从入门到飞翔0、前言1、分布式文件系统2、MinIO 介绍3、 MinIO安装&#xff08;docker&#xff09;4、基本概念5、通过代码上传文件到MinIO6、封装MinIO为starter7、在其他项目中集成封装好的模块 0、前言 对象存储是一种数据存储架构&#x…

互联网应用主流框架整合之SpringMVC基础组件开发

多种传参方式 在前一篇文章互联网应用主流框架整合之SpringMVC初始化及各组件工作原理中讨论了最简单的参数传递&#xff0c;而实际情况要复杂的多&#xff0c;比如REST风格&#xff0c;它往往会将参数写入请求路径中&#xff0c;而不是以HTTP请求参数传递&#xff1b;比如查询…

audio标签隐藏播放器尾部的三个点

问题&#xff1a; 在谷歌浏览器上&#xff0c;展示audio音频控件时&#xff0c;后面有三个点&#xff0c;点击后会显示下载和播放速度&#xff0c;想隐藏这两个控件。 注意&#xff1a; 不是所有版本都有这三个点&#xff0c;甚至有的版本里面三个点里面的控件只有下载。 解…

【Windows10】查看WIFI密码

操作步骤 电脑上查看已连接Wi-Fi的密码的步骤如下: 连接需要查看密码的Wi-Fi。右键点击任务栏上的 [网络] 图标&#xff0c;选择 [开启"网络和Internet"设置]。在 高级网络设置 项目中&#xff0c;点选 [网络和共享中心]。开启网络和共享中心的窗口后&#xff0c;点…

通过U盘 读去BIN文件进行校验写入到外部存储FLASH算法

算法原理: 数据读取:代码首先确定每次从USB设备读取的数据量(1024字节或剩余的数据量,取较小值)。错误处理:如果读取操作失败,则记录日志并跳转到错误处理部分(FILE_CLOSE)。更新剩余数据量:每次读取后,更新DataRemain以反映剩余要读取的数据量。校验和计算:在文件…

vue打包exe实战记录

vue项目不支持直接打包exe,可以依靠electron进行打包,处理方式是将vue打包的dist文件夹放到electron项目中,通过配置后打包electron.先看下本地环境 下面是实操记录: 1.vue项目打包 vue.config.js中设置项目路径为 module.exports {//publicPath: /chat_pc/, // 前端项目…

苍穹外卖笔记-13-导入地址簿功能代码、用户下单、订单支付

文章目录 1. 导入地址簿功能代码1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码导入1.2.1 Mapper层1.2.2 Service层1.2.3 Controller层 1.3 功能测试 2. 用户下单2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 DTO设计…

速盾的防护策略有哪些?

在当今数字化时代&#xff0c;网络安全至关重要&#xff0c;而速盾作为一款优秀的安全防护工具&#xff0c;拥有一系列全面且有效的防护策略。 首先&#xff0c;速盾采用了先进的访问控制策略。通过严格的身份验证和授权机制&#xff0c;确保只有合法的用户和应用程序能够访问特…

个人 PCB 设计规范

目录 PCB 布局规范 分模块布局 布局原则 PCB 布线规范 布线原则 布线顺序 规则设置 PCB 布局规范 分模块布局 按功能模块&#xff1a;完成同一功能的电路&#xff08;指由分立元件组成&#xff0c;实现特定功能的模块&#xff09;&#xff0c;应尽量靠近放置。 按电…

Spotify 音乐平台宣布成立内部创意机构,测试生成式人工智能配音广告

Spotify是一家流媒体音乐平台&#xff0c;提供广泛的音乐、播客和视频内容。用户可以通过订阅服务Spotify Premium来享受更多高级功能&#xff0c;如无广告播放、离线听歌等。 Spotify 周四宣布&#xff0c;它将通过其首家名为 Creative Lab 的内部创意机构进一步进军广告领域…

集合查询-并(UNION)集运算、交(INTERSECT)集运算、差(EXCEPT)集运算

一、概述 集合查询是对两个SELECT语句的查询结果进行再进行处理的查询 二、条件 1、两个SELECT语句的查询结果必须是属性列数目相同 2、两个SELECT语句的查询结果必须是对应位置上的属性列必须是相同的数据类型 三、并(UNION)运算 1、语法格式&#xff1a; SELECT 语句1…

RedHat 9.3 一键安装 Oracle 11GR2 单机

前言 Oracle 一键安装脚本,演示 RedHat 9.3 一键安装 Oracle 11GR2 单机过程(全程无需人工干预)。 ⭐️ 脚本下载地址:Shell脚本安装Oracle数据库 安装准备 1、安装好操作系统,建议安装图形化2、配置好网络3、挂载本地 ISO 镜像源4、上传软件安装包(安装基础包,补丁包)…

Android中蓝牙设备的状态值管理

在Android中&#xff0c;蓝牙状态可以通过多种方式来描述&#xff0c;主要包括蓝牙适配器状态、蓝牙设备连接状态以及蓝牙广播状态&#xff0c;其关键的蓝牙状态实现类有BluetoothAdapter、BluetoothDevicePairer、BluetoothDevice、BluetoothProfile&#xff0c;详细介绍如下&…

基于Ubuntu 20.04 实现MySQL主从同步

基于Ubuntu 20.04 实现MySQL主从同步 环境准备&#xff1a; 1.mysql-master:192.168.1.21 2.mysql-slave:192.168.1.22 1. 安装MySQL 8.0 在主服务器和从服务器上执行以下命令安装MySQL 8.0&#xff1a; sudo apt update sudo apt install mysql-server安装完成后&#xf…