Python接口自动化之使用requests库发送http请求

news2024/11/20 1:42:34

requests库

​ 什么是Requests ?Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。

​ 安装:cmd命令行执行pip install requests

HTTP 请求方法

​ HTTP 协议 (Hyper Text Transfer Protocol),一个基于TCP/IP通信协议来传递数据,包括html文件、图像、结果等,即是一个客户端和服务器端请求和应答的标准。根据HTTP 标准,HTTP 请求可以使用多种请求方法。

HTTP 0.9:只有基本的文本GET请求,没有固定的版本号,不支持请求头。
HTTP 1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法:GET,POST和HEAD方法。
HTTP 1.1:在1.0的基础上进行更新,新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
HTTP 2.0(未普及):请求/响应首部的定义基本没有改变,只是所有首部键必须全部小写,而且请求行要独立

为:method、:scheme、:host、:path这些键值对。
在这里插入图片描述

​ HTTP请求常用的Get和Post两种方法:

GET是从服务器上获取数据,POST是向服务器传送数据
GET请求参数都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,也就是说GET请求的参数是URL的一部分。
POST请求参数是在请求体当中,消息长度没有限制且以隐式的方式进行传送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码

发送GET请求

​ 关键代码:requests.get(url)

​ 参数说明:若需要传请求参数,可直接在 url 后面添加,也可以在调用get()方法时通过关键字params传入,需要注意的是params需要传入dict(字典)类型。

​ 下面以请求百度为例,发送get请求:

import requests

# 通过url直接加上请求参数,与通过params传参效果是一样的
response = requests.get(url='http://www.baidu.com/s?wd=requests模块')
# 通过params传参
response2 = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模块"})
print(response.status_code)		# 打印状态码
# print(response.text)		# 获取响应内容

运行结果:

C:\software\python\python.exe D:/learn/test.py
200

Process finished with exit code 0

 发送POST请求

​ 关键代码:requests.post(url, data)

​ 参数说明:可传dict类型也可传json类型,dict类型使用关键字data传参,json类型则为使用关键字json传参。若无需传参可不传。

register_url = "http://127.0.0.1:666/index/register"

# 添加请求头,需要就传
header = {
    "Content-Type": "application/json"
}

# json类型的参数
json = {
    "mobile_phone": "15612345678",
    "pwd": "Test1234",
    "type": 0
}
# 发送post请求
response = requests.post(url=register_url, json=json, headers=header)
print(response.json())

# 打印结果:{'code': 200, 'msg': 'success', 'password': '321', 'username': '123'}

​ 上面举例为json类型的传参,json和dict类型的数据结构表面上看有点相似,那怎么判断什么时候用json什么时候用dict呢?只要查看请求头,需要哪种就传哪种,表单类型的参数,即"Content-Type: application/x-www-form-urlencoded"就使用关键字data去传dcit类型的参数,像上面举例的"Content-Type": "application/json"json类型的参数一定要使用关键字json去传递。

获取响应数据

​ 常见的属性:

response.status_code:获取响应状态码
response.cookies:获取cookies
response.headers:获取头部信息
response.url:获取url
response.text:自动识别文本中的编码格式进行解码,但有时候不准确,会出现乱码
response.content.decode(‘utf-8’):response.content,获取字节流的数据,进行decode解码,默认是utf8
response.json():json方法可以将json字符串转换成对应的python类型的数据,接口返回的数据99%都是json类型的

import requests

response = requests.get(url='http://www.baidu.com/s?wd=requests模块')
# response = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模块"})

print("这是status_code:{}\n".format(response.status_code))

print("这是cookies:.{}\n".format(response.cookies))

print("这是headers:.{}\n".format(response.headers))

print("这是url:.{}\n".format(response.url))

# print("这是响应页面文本信息:.{}\n".format(response.text))   # 因为返回数据太长,不作运行
# print("这是获取的字节流数据decode解码:.{}\n".format(response.content.decode()))

运行结果:

C:\software\python\python.exe D:/learn/test.py
这是status_code:200

这是cookies:.<RequestsCookieJar[<Cookie BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1 for .baidu.com/>, <Cookie BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9 for .baidu.com/>, <Cookie H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437 for .baidu.com/>, <Cookie PSINO=6 for .baidu.com/>, <Cookie PSTM=1596554477 for .baidu.com/>, <Cookie delPer=0 for .baidu.com/>, <Cookie BDSVRTM=11 for www.baidu.com/>, <Cookie BD_CK_SAM=1 for www.baidu.com/>]>

这是headers:.{'Bdpagetype': '3', 'Bdqid': '0xf2cd9ccf00070e08', 'Cache-Control': 'private', 'Ckpacknum': '2', 'Ckrndstr': 'f00070e08', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=utf-8', 'Date': 'Tue, 04 Aug 2020 15:21:17 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM ", CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=6EC84DD4DE623D15C087081CA8B7A6D9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1596554477; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1; max-age=31536000; expires=Wed, 04-Aug-21 15:21:17 GMT; domain=.baidu.com; path=/; version=1; comment=bd, delPer=0; path=/; domain=.baidu.com, BD_CK_SAM=1;path=/, PSINO=6; domain=.baidu.com; path=/, BDSVRTM=11; path=/, H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437; path=/; domain=.baidu.com', 'Traceid': '1596554477018818305017495812540276870664', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}

这是url:.http://www.baidu.com/s?wd=requests%E6%A8%A1%E5%9D%97


Process finished with exit code 0

高级操作

​ 在上面我们基本了解了requests库的基本用法,如GET、POST请求以及response的属性,接下来我们再看下requests库的一些高级用法,如下载/上传文件、Cookies设置、代理设置等

文件下载

​ 与发送请求区别无二,只是保存时需要处理一下,如下载图片,把获取图片的二进制数据然后用二进制写入文件即可。

import requests
 
response = requests.get('https://github.com/favicon.ico')
 
# 获取二进制数据,然后写入文件
with open('favicon.ico','wb')as f:
    f.write(response.content)
    f.close

文件上传

​ 关键代码:requests.post(utl, files=files)

import requests
 
file = {'file':open('favicon.ico','rb')}	# 将之前抓取的github图标以二进制格式读取

response = requests.post('http://httpbin.org/post', files = file)

print(response.text)      

SSL证书验证

​ 为什么会有SSL证书验证,SSL是什么?

​ SSL协议是网络层和传输层的协议。SSL(Secure Sockets Layer 安全套接层)协议,及其继任者TLS(Transport Layer Security传输层安全)协议,是为网络通信提供安全及数据完整性的一种安全协议。

​ HTTPS是兼容HTTP的,可以把HTTPS理解为’HTTP over TSL’,即HTTPS是HTTP协议和TSL协议的组合。HTTPS在传输数据时,同样会先建立TCP连接,建立起TCP连接后,会建立TSL连接。请求可以为HTTPS请求验证SSL证书,就像我们使用的浏览器一样,SSL验证默认是开启的,如果证书验证失败,请求会抛出一个SSLError,如下图:
在这里插入图片描述

碰到请求SSL验证的,我们是可以直接跳过不验证的,通过设置verify=False就可关闭错误提示,跳过SSL验证,这里只是忽略了SSL验证,并不是没有了SSL验证,它仍然会存在一个警告信息InsecureRequestWarning。

import requests
#通过一下两行代码即可把警报消除,即使verify=False,报警还是存在的
from requests.packages import urllib3
 
urllib3.disable_warnings()
 
response = requests.get('https://www.12306.cn',verify = False)
print(response.status_code)

保持会话

​在requests中,如果直接使用get()或post()等方法是可以做到模拟网页的接口请求,但是每次发起请求结束后它就结束了,并不会保存相关的验证信息,如cookies/token;比如第一次使用post()请求登录了某个网站,第二次想获取成功登录后的用户个人信息,再一次发起post()请求时它会要求你需求先登录,明明第一次请求时已经登录了,为什么第二次还提示要先登录呢?实际上两次请求相当于使用了两个浏览器去访问,是两个完全不相关的会话,因此第二次请求是拿不到用户信息的。

​ requests中的session对象能够让我们跨http请求保持某些参数,即让同一个session对象发送的请求头携带某个指定的参数。当然,最常见的应用是它可以让cookie保持在后续的一串请求中。

# 创建一个session对象,使它能够自动记录上一次请求中的cookie信息
se = requests.session()

# 登录接口
login_url = "http://www.test.com/api/member/login"
login_data = {
    "mobilephone": "15612345678",
    "pwd": "Test1234"
}
res = se.post(url=login_url, data=login_data)

# 登录后查询用户最近的订单记录
order_record_url = "http://www.test.com/api/member/order"
record_data = {
    "beginTime": "2020-08-01",
    "endTime": "2020-08-15"
}
res2 = se.post(url=order_record_url, data=record_data)
print(res2.json())

requests封装

​ 凡是需要重复使用的,我们都可以对它进行二次封装,写成我们自己的版本,还可以在封装过程中加入我们想要的内容,使用的时候直接调用即可。

python

import requests

class SendSessionRequest:
“”“使用session鉴权的接口,记录cookies/token”“”

def __init__(self):
    self.session = requests.session()

def requests(self, url, method, params=None, data=None, json=None, headers=None):
    method = method.lower()
    if method == "post":
        return self.session.post(url=url, json=json, data=data, headers=headers)
    elif method == "patch":
        return self.session.patch(url=url, json=json, data=data, headers=headers)
    elif method == "get":
        return self.session.get(url=url, params=params)

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


一、Python编程入门到精通


二、接口自动化项目实战  

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具


八、JMeter性能测试 

九、总结(尾部小惊喜)

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

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

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

                                     

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

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

相关文章

Vivado常见critical warning 、error

综合 Designutils 20-1281 如下图所示 可能原因 在复制Vivado工程时&#xff0c;IP文件缺少导致 解决方法 重新生成IP即可

【雕爷学编程】MicroPython动手做(29)——物联网之SIoT 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Chat模块封装

封装保存用户类 utils/chat.js class Chat{constructor(){// 当前登录的用户this._user null;// 会话数组 和多个人this._sessions []; //user message// 当前会话 &#xff08;和谁在聊天&#xff09;this._current_session null;}setUser(user){this._user user} }exp…

百度贴吧视频推送排名软件怎么卖

百度贴吧视频上传工具 软件有月卡、季卡、半年卡、年卡 【有时软件个别卡种售空&#xff0c;价格有上涨下降不定&#xff0c;需要的话联系客服获取当日价格】 视频教程&#xff1a; 软件功能&#xff1a; 1.软件不限制账号&#xff0c;可以批量循环发布 2.贴吧同步功能&am…

2023,谁在引领实时互动进入高清时代?

实践是检验真理的唯一标准&#xff0c;技术是行业进步的核心动能。在实时互动的新时代里&#xff0c;不断进化的声网已然完成自证。 作者|斗斗 出品|产业家 “一个医疗行业的客户&#xff0c;曾向我们提出一个需求&#xff0c;希望在120急救场景下&#xff0c;可以远程看清…

二进制的运算

二进制的运算 位与&#xff08;&&#xff09;位或&#xff08;|&#xff09;异或&#xff08;^&#xff09; 位与&#xff08;&&#xff09; 类似于逻辑与运行&#xff0c;当条件都为true时&#xff0c;结果才为true。 0 & 0 0 0 & 1 0 1 & 0 0 1 &…

人力资源管理servlet人事考勤员工部门java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 人力资源管理servlet 系统有1权限&#xff1a;管理员…

定时任务实现:Timer、Quartz

文章目录 JDK中Timer使用及原理Timer使用调度一次性任务调度可重复执行任务 取消调度器和任务 定时任务线程池Quartz框架核心类说明Trigger触发器SimpleTriggerCronTrigger(重点) Spring整合Quartz&#xff08;重点&#xff09;任务信息SQL存储Maven 主要依赖配置文件quartz配置…

【Python】Python 实现猜单词游戏——挑战你的智力和运气!

文章目录 前言学到什么?导入 random 模块定义生命次数定义神秘单词并进行随机选择定义 clue&#xff08;猜测进度&#xff09; 列表&#xff0c;用问号 ? 初始化定义心形符号的 Unicode 编码初始化 guessed_word_correctly 变量定义更新猜测进度函数 update_clue主循环&#…

月木商城项目:开发者的概述

概述 本项目由博主本人自主开发,从后端的方方面面到前端的css的样式设计,以及项目的部署上云全部由本人开发完成 博主的技术栈有哪些 给大家看一下我的笔记网站,让大家对我有个了解

JVM面试题--垃圾回收

对象什么时候可以被垃圾器回收 在学习相关内容之前我们要明白两个问题&#xff0c;我们为什么要垃圾回收&#xff1f;回收哪里的垃圾呢&#xff1f; 垃圾回收主要指的是堆中的对象&#xff0c;堆是一个共享区域&#xff0c;我们创建的对象和数组&#xff0c;都存储在当前位置…

Git基础知识:常见功能和命令行

文章目录 1.Git介绍2.安装配置2.1 查看配置信息 3.文件管理3.1 创建仓库3.2 版本回退3.3 工作流程3.4 撤销修改3.5 删除文件 4.远程仓库4.1 连接远程库4.2 本地上传至远程4.3 从远程库克隆到本地 5.分支管理5.1 创建分支5.2 删除分支5.3 合并分支解决冲突 参考&#xff1a; Git…

(5)将固件加载到没有ArduPilot固件的主板上

文章目录 前言 5.1 下载驱动程序和烧录工具 5.2 下载ArduPilot固件 5.3 使用测试版和开发版 5.3.1 测试版 5.3.2 最新开发版本 5.4 将固件上传到自动驾驶仪 5.5 替代方法 5.6 将固件加载到带有外部闪存的主板上 前言 ArduPilot 的最新版本&#xff08;Copter-3.6, Pl…

顺序表、链表刷题指南(力扣OJ)

目录 前言 题目一&#xff1a;删除有序数组中的重复项 思路&#xff1a; 题解&#xff1a; 题目二&#xff1a;合并两个有序数组 思路&#xff1a; 分析&#xff1a; 题解&#xff1a; 题目三&#xff1a;反转链表 思路&#xff1a; 分析&#xff1a; 题解&#xff1a; 题目四&…

软考A计划-系统集成项目管理工程师-信息文档和配置管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

【LeetCode每日一题】——304.二维区域和检索-矩阵不可变

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 中等 三【题目编号】 304.二维区域和检索-矩阵不可变 四【题目描述】 …

【沁恒蓝牙mesh】CH58x flash分区与数据存储管理

本文主要介绍了 沁恒蓝牙芯片 CH58x 的flash 分区与数据存储管理 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&…

DPG算法

1 一言以蔽之 &#xff08;1&#xff09; DPG是属于确定性策略梯度算法&#xff08;2&#xff09;用于解决连续动作空间问题 2 优点和缺点 2.1 优点&#xff08;1&#xff09;从理论上可以证明&#xff0c;deterministic policy的梯度就是Q函数梯度的期望&#xff0c;这使得…

SAP数据库表维护视图生成器的使用

在SAP中&#xff0c;经常需要自定义数据库表。而且可能需要人工维护数据库表中的数据&#xff0c;可以通过SM30进行维护数据&#xff1b;但是SM30事务的权限太大&#xff0c;不适宜将SM30直接分配&#xff1b;因此&#xff0c;可以通过给维护表分配事务代码&#xff0c;来达到控…

云曦暑期学习第三周——ctfshow--php特性(89-104)

目录 web89 preg_match函数 、数组 web90 intval()函数、强比较 web91 正则修饰符 web92 intval()函数、弱比较 web93 八进制、小数点 web94 strpos() 函数、小数点 web95 小数点 web96 highlight_file() 下的目录路径 web97 数组 web98 三目运算符 web9…