Python接口自动化之使用requests库发送http请求
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请求:
python
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) # 获取响应内容
运行结果:
shell
C:\software\python\python.exe D:/learn/test.py
200Process finished with exit code 0
发送POST请求
关键代码:requests.post(url, data)
参数说明:可传dict类型也可传json类型,dict类型使用关键字data传参,json类型则为使用关键字json传参。若无需传参可不传。
python
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类型的
python
import requestsresponse = 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()))
运行结果:
shell
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%97Process finished with exit code 0
高级操作
在上面我们基本了解了requests库的基本用法,如GET、POST请求以及response的属性,接下来我们再看下requests库的一些高级用法,如下载/上传文件、Cookies设置、代理设置等
文件下载
与发送请求区别无二,只是保存时需要处理一下,如下载图片,把获取图片的二进制数据然后用二进制写入文件即可。
python
import requestsresponse = 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)
python
import requestsfile = {'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。
python
import requests
#通过一下两行代码即可把警报消除,即使verify=False,报警还是存在的
from requests.packages import urllib3urllib3.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保持在后续的一串请求中。
python
# 创建一个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)
学习安排上!
感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几个月时间整理的非常全面的,希望也能帮助到有需要的你!
这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……
文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方进群自行领取即可,拿走不谢。
Python接口自动化之使用requests库发送http请求相关推荐
- python调用接口requests_【python接口自动化】- 使用requests库发送http请求
前言:什么是Requests ?Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤ ...
- 接口测试 — 使用Requests库发送POST请求
POST请求用于向服务器提交数据,比如提交一个表单新建一个用户.或修改一个用户信息等操作. 对于POST请求,我们可以通过浏览器开发者工具或者其他外部工具来进行抓包,得到请求的URL.请求头(requ ...
- Python网络编程:使用requests.post发送POST请求
Python网络编程:使用requests.post发送POST请求 在Python中,requests是一个强大的库,它可以用于发送HTTP请求并且处理响应.requests.post()函数是这个 ...
- Python接口自动化-python使用requests库发送Get请求
python -Requests的用法官方文档: https://requests.readthedocs.io/zh_CN/latest/ Requests发送Get请求 import reques ...
- python接口自动化项目_Python+requests接口自动化完整项目框架整理笔记
前言 通过学习"上海悠悠"博客,自己手动敲了一遍整体的自动化项目搭建,编写用例,打印log日志,生成测试报告,将报告发送至邮箱整体流程跑了一遍,勉强跑通了 一,项目结构 --cas ...
- 【python接口自动化-requests库】【三】优化重构requests方法
一.重构post请求方法 上一张讲了如何使用requests库发送post请求,但是有时候,我们写脚本,不可能这么简单,代码完全不可复用,重复工作,那我们是不是可以想象,把我们的get,post请求, ...
- python的requests库发送携带上传文件的接口_python requests 库请求带有文件参数的接口实例...
python requests 库请求带有文件参数的接口实例 有些接口参数是一个文件格式,比如fiddler 抓包参数如下显示 这个接口的 form-data fiddler 显示的和不带文件参数的接 ...
- Python接口自动化-requests模块之post请求
------·今天距2021年262天·------ 这是ITester软件测试小栈第111次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化-requests模块之get请求 ...
- Python接口自动化之requests请求封装
------·今天距2021年253天·------ 这是ITester软件测试小栈第114次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化之Token详解及应用,介绍tok ...
- python接口自动化(八)--发送post请求的接口(详解)
简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了.答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统 ...
最新文章
- python3 导入自定义函数
- vim插件自动补齐_Vim7.3.3使用Autocomplpop自动补全插件报错解决办法
- 学习笔记之web worker
- 一文说通C#中的异步编程补遗
- 数字基带传输学习笔记00引言
- arm ida 伪代码 安卓 符号表_IDA 制作 sig文件 gdb 导入符号表
- (11)FPGA面试技能提升篇(Cadence)
- sql视图能使用触发器吗_冰箱买回家能立即使用吗 冰箱买回家要放多久能使用【详解】...
- java年度总结自我认知,java自我评价
- 机器学习算法_机器学习之EM算法和概率图模型
- uniapp中利用监视vuex中state数据配合uview实现登录消息提示
- 养老院管理系统如何开发详解
- Aliplayer自定义组件
- 打印机服务器wps101官方网站,打印机服务器工具
- 内部 CA 证书管理
- 二叉树的中序遍历算法
- 图算法设计之用普里姆Prim算法构造最小生成树
- 基于虹软人证核验 2.0 Android SDK开发集成入门
- 第一章 计算机基础知识【信息学奥赛】
- 2017京东校招面试回忆 已成功拿到offer
热门文章
- mysql ddl 进度_mysql 5.7 Stage Tracking DDL进度跟踪
- Compile syslog-win32
- Android读取手机通讯录
- 敏捷软件质量保证的方法与实践
- 【线性代数及其应用】02 -矩阵代数
- 视频教程-sql注入系列课程-渗透测试
- Android P之监听Process Activity TaskStack状态变化
- Windows2003操作系统SQL Server 2008安装图解(详细)
- 解决nginx访问php文件变成下载
- 博客首页全新改版;博客代码片支持折叠;原创博文新增打赏功能……【2022.1.17】