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请求相关推荐

  1. python调用接口requests_【python接口自动化】- 使用requests库发送http请求

    前言:什么是Requests ?Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤ ...

  2. 接口测试 — 使用Requests库发送POST请求

    POST请求用于向服务器提交数据,比如提交一个表单新建一个用户.或修改一个用户信息等操作. 对于POST请求,我们可以通过浏览器开发者工具或者其他外部工具来进行抓包,得到请求的URL.请求头(requ ...

  3. Python网络编程:使用requests.post发送POST请求

    Python网络编程:使用requests.post发送POST请求 在Python中,requests是一个强大的库,它可以用于发送HTTP请求并且处理响应.requests.post()函数是这个 ...

  4. Python接口自动化-python使用requests库发送Get请求

    python -Requests的用法官方文档: https://requests.readthedocs.io/zh_CN/latest/ Requests发送Get请求 import reques ...

  5. python接口自动化项目_Python+requests接口自动化完整项目框架整理笔记

    前言 通过学习"上海悠悠"博客,自己手动敲了一遍整体的自动化项目搭建,编写用例,打印log日志,生成测试报告,将报告发送至邮箱整体流程跑了一遍,勉强跑通了 一,项目结构 --cas ...

  6. 【python接口自动化-requests库】【三】优化重构requests方法

    一.重构post请求方法 上一张讲了如何使用requests库发送post请求,但是有时候,我们写脚本,不可能这么简单,代码完全不可复用,重复工作,那我们是不是可以想象,把我们的get,post请求, ...

  7. python的requests库发送携带上传文件的接口_python requests 库请求带有文件参数的接口实例...

    python requests 库请求带有文件参数的接口实例 有些接口参数是一个文件格式,比如fiddler 抓包参数如下显示 这个接口的 form-data fiddler 显示的和不带文件参数的接 ...

  8. Python接口自动化-requests模块之post请求

    ------·今天距2021年262天·------ 这是ITester软件测试小栈第111次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化-requests模块之get请求 ...

  9. Python接口自动化之requests请求封装

    ------·今天距2021年253天·------ 这是ITester软件测试小栈第114次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化之Token详解及应用,介绍tok ...

  10. python接口自动化(八)--发送post请求的接口(详解)

    简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了.答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统 ...

最新文章

  1. python3 导入自定义函数
  2. vim插件自动补齐_Vim7.3.3使用Autocomplpop自动补全插件报错解决办法
  3. 学习笔记之web worker
  4. 一文说通C#中的异步编程补遗
  5. 数字基带传输学习笔记00引言
  6. arm ida 伪代码 安卓 符号表_IDA 制作 sig文件 gdb 导入符号表
  7. (11)FPGA面试技能提升篇(Cadence)
  8. sql视图能使用触发器吗_冰箱买回家能立即使用吗 冰箱买回家要放多久能使用【详解】...
  9. java年度总结自我认知,java自我评价
  10. 机器学习算法_机器学习之EM算法和概率图模型
  11. uniapp中利用监视vuex中state数据配合uview实现登录消息提示
  12. 养老院管理系统如何开发详解
  13. Aliplayer自定义组件
  14. 打印机服务器wps101官方网站,打印机服务器工具
  15. 内部 CA 证书管理
  16. 二叉树的中序遍历算法
  17. 图算法设计之用普里姆Prim算法构造最小生成树
  18. 基于虹软人证核验 2.0 Android SDK开发集成入门
  19. 第一章 计算机基础知识【信息学奥赛】
  20. 2017京东校招面试回忆 已成功拿到offer

热门文章

  1. mysql ddl 进度_mysql 5.7 Stage Tracking DDL进度跟踪
  2. Compile syslog-win32
  3. Android读取手机通讯录
  4. 敏捷软件质量保证的方法与实践
  5. 【线性代数及其应用】02 -矩阵代数
  6. 视频教程-sql注入系列课程-渗透测试
  7. Android P之监听Process Activity TaskStack状态变化
  8. Windows2003操作系统SQL Server 2008安装图解(详细)
  9. 解决nginx访问php文件变成下载
  10. 博客首页全新改版;博客代码片支持折叠;原创博文新增打赏功能……【2022.1.17】