目录
前言
简介及安装
reuqests库详解
reuqests库方法
get请求
post请求
put和delete请求
requests库的异常机制
试着用postman做完接口测试后,觉得工具做接口测试是非常便捷的。但是也存在着一定的不足和弊端。比如:
1. 敏捷开发,接口一般数量很大,团队实现接口测试,版本控制
2. 功能太死板,有些接口完全无法实现(复杂的加密接口,签名接口等)
3. 接口项目当中有多种不同协议的接口
4. 排错,定位接口问题不方便,结合抓包实现
5. 没有办法生成美观的报告
6. 多接口串联,数据库验证,日志监控
7. 有些公司会做web自动化+接口自动化
等等这些问题,驱使这我们去用代码去解决这些问题,本编文章就将阐述依赖requests库来做接口自动化测试的一些基础知识,来解决或者缓解以上问题,也是接口自动化测试的一些基础,有了这些基础知识做基石,才能灵活的使用不同的方式去进行接口自动化测试。
requests是一个Python第三方库,处理URL资源特别方便,模拟发送HTTP请求,做接口自动化。经常爬虫也会使用到该库。说到爬虫,以前总听说爬虫,觉得好厉害。。自从开始学习python之后,觉得拨开云雾见月明,对爬虫也有一些浅显的认识。
官方来讲:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。大部分爬虫都是按“发送请求——获得页面——解析页面——抽取并储存内容”这样的流程来进行,这其实也是模拟了我们使用浏览器获取网页信息的过程。因此使用requests库就非常便捷。合理合法的使用爬虫技术也是非常有必要的。
言归正传:requests是一个Python第三方库,处理URL资源特别方便,模拟发送HTTP请求,做接口自动化。
安装使用命令:pip install requests
先从全局的角度去思考requests库。无非分为两种:请求和响应。看一些简单的请求和响应的案例,从全局的角度去思考该库。
请求:
requests.get() 发送get请求
requests.post() 发送post请求
requests.delete() 发送delete请求
requests.put() 发送put请求
requests.request() 最核心的方法
响应:
rep=requests.request()
rep.text //返回字符串的数据
rep.content //返回字节格式的数据
rep.json() //返回字典格式的数据
rep.status_code //返回状态码
rep.reason //返回状态信息
rep.cookie //返回cookie
rep.encoding //返回编码格式
rep.headers //返回响应头信息
总结来说,requests库只有一个核心的方法,即request方法,其余的方法则是通过request方法来实现各种各样的操作。通过封装调用request方法,加之添加其他代码,减少代码的编写量,所以说request方法一个核心的方法。
当时有思考过一个问题,都是获取返回数据的方法,
response.content :这个是直接从网络上抓取的数据,没有经过任何的编码,所以是一个bytes类型,其实在硬盘上和网络上传输的字符串都是bytes类型
response.text:这个是str的数据类型,是requests库将response.content进行解码的字符串,解码需要指定一个编码方式,requests会根据自己的猜测来判断编码的方式,所以有时候可能会猜测错误,就会导致解码产生乱码,这时候就应该进行手动解码,比如使response.content.decode('utf-8')
以上是源码分析,下面进行举例来说明~~
1. get请求不带参数
import requests
r = requests.get('https://www.baidu.com/')
print(r.status_code)
print(r.text)
2. get请求带参数
#get带参数,传入一个dict作为params参数
r = requests.get('https://www.douban.com/search', params={'q': 'python', 'cat': '1001'})
# 实际请求的URL
print(r.url)
# requests自动检测编码
print(r.encoding)
# 获得bytes对象,原始内容
print(r.content)
#转化为文本
print(r.text)
#获取响应头
r.request.headers
r.headers['Content-Type'] //data:application/x-www-form-urlencoded表单格式 json:application/json json格式
#获取cookie
r.cookies['ts']
# 对于特定类型的响应,例如JSON,可以直接获取
print(r.json())
3.需要传header
#需要传入HTTP Header时,我们传入一个dict作为headers参数
r = requests.get('https://www.douban.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})
print(r.text)
4.需要传cookie
#传入Cookie,只需准备一个dict传入cookies参数:
cs = {'token': '12345', 'status': 'working'}
r = requests.get(url, cookies=cs)
5.指定超时
#指定超时,传入以秒为单位的timeout参数:
r = requests.get(url, timeout=2.5) # 2.5秒后超时
1. 传data数据
#要发送POST请求,只需要把get()方法变成post(),然后传入data参数作为POST请求的数据:
r = requests.post('https://accounts.douban.com/login',
data={'form_email': '[email protected]', 'form_password': '123456'})
2. 传json数据
# 内部自动序列化为JSON
params = {'key': 'value'} r = requests.post(url, json=params)
【data】:
数据报文:dict字典类型,默认情况下请求头:application/x-www-form-urlencoded,表示以form表单方式传参,格式:a=1&b=2&c=3
数据报文:str类型。默认情况下请求头:text/plain,表示以文本方式传参(如果是字典格式需要转换为str格式传参)
【json】:
数据报文:不管是dict还是str类型,默认都是application/json,请求的格式{"a":1,"b":2}
总的来说:data只能传简单的只有键值对的dict或者str格式。json一般只能传dict格式(简单和嵌套都可以)。。理解了这些,在日常使用中遇到问题就能很好的定位。
3. 传文件
#类似的,上传文件需要更复杂的编码格式,但是requests把它简化成files参数:
upload_files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=upload_files)
4.还会有特殊情况,比如 一些接口使用代理
只要在请求的方法中(比如get或者post)传递proxies参数就可以了。
import requests
proxy = {
'代理IP'
}
url = 'url'
resp = requests.get(url,proxies=proxy)
print(resp.text)
5. 处理不信任的SSL证书
对于那些已经被信任的SSL证书的网站,比如https://www.baidu.com/,那么使用requests直接就可以正常的返回响应。示例代码如下:
resp = requests.get('',verify=False)
print(resp.content.decode('utf-8'))
把post()方法替换为put(),delete()等,就可以以PUT或DELETE方式请求资源。就不一一赘述。
上面的内容足以让我们使用起来requests库啦,但是,作为编程人员,我们最关注程序的部分应该是运行的稳定性,而不是性能等问题,所以一个合格的程序必须要有对各种异常产生的处理机制),下面就浅写一下requests库的异常机制。
request.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接 |
request.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
个人觉得,以上只是了解,遇到的时候再查询深究即可。
如果出现了异常,该如何判断呢?给出一个方法:r.raise_for_status()
该方法在内部判断r.status_code是否等于200,不是则产生异常requests.HTTPError
利用try-except语句去捕获和处理异常。
以上为学习requests库所学的记录,共勉~~