Requests模块详解 接口自动化测试和爬虫必备

目录

前言

简介及安装

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

reuqests库详解

         先从全局的角度去思考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.text和response.content的区别:

response.content :这个是直接从网络上抓取的数据,没有经过任何的编码,所以是一个bytes类型,其实在硬盘上和网络上传输的字符串都是bytes类型

response.text:这个是str的数据类型,是requests库将response.content进行解码的字符串,解码需要指定一个编码方式,requests会根据自己的猜测来判断编码的方式,所以有时候可能会猜测错误,就会导致解码产生乱码,这时候就应该进行手动解码,比如使response.content.decode('utf-8')

reuqests库方法

get请求

  • url:欲获取网页的网址链接url
  • params:可选参数,选择字典或者字节流格式
  • **kwargs:12个控制访问的参数

以上是源码分析,下面进行举例来说明~~

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秒后超时

post请求

  • url:欲获取网页的网址链接url
  • data:字典、字节序列或文件,request的内容
  • json:JSON格式的数据,request的内容
  • **kwargs:12个控制访问的参数

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)
  • 那么存在一个问题:get请求是通过params传递参数;post请求通过json或者data传参,区别是什么?进行了如下整理:

【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'))

put和delete请求

把post()方法替换为put(),delete()等,就可以以PUT或DELETE方式请求资源。就不一一赘述。

requests库的异常机制

        上面的内容足以让我们使用起来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库所学的记录,共勉~~

你可能感兴趣的:(接口自动化测试,自动化,爬虫,python,单元测试,模块测试)