接口测试之Python Requests基本功能使用
一、Requests简介
进行接口测试需要发送HTTP请求,Python最基础的 HTTP 库有 Urllib、Httplib2、Requests、Treq 等,这里我们推荐使用Requests
库来进行接口测试。
Requests 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。目前很多Python爬虫也使用Requests
库
1.1、功能特性
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持 .netrc(用户配置脚本文件)
1.2、Requests安装
使用pip安装命令如下,-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 是使用镜像加速下载用的:
pip install requests -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
二、Requests 基础应用
2.1、发送不同类型HTTP请求
import requests base_url='http://httpbin.org' #发送GET类型的请求 r=requests.get(base_url+'/get') print(r.status_code) #发送Post类型请求 r=requests.post(base_url+'/post') print(r.status_code) #发送PUT类型请求 r=requests.put(base_url+'/put') print(r.status_code) #发送Delete类型请求 r=requests.delete(base_url+'/delete') print(r.status_code)
执行结果,200为请求返回的状态码,表示请求成功:
2.2、传递URL参数
一般在GET请求中我们使用查询字符串(query string)来进行参数传递,在requests库中使用方法如下:
import requests base_url='http://httpbin.org' param_data={'key1': 'value1', 'key2': 'value2'} r=requests.get(base_url+'/get',params=param_data) print(r.text)
执行结果如下:
2.3、请求头定制
如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict
给 headers
参数就可以了。
import requests base_url='http://httpbin.org' param_data={'key1': 'value1', 'key2': 'value2'} header={'User-Agent':"Mozilla/5.0"} r=requests.get(base_url+'/get',params=param_data, headers=header) print(r.text)
执行结果如下:
注意:很多爬虫程序都会定制headers来避免被封。
2.4、响应内容
当请求发送成功之后,我们可以获取响应内容。如响应状态码,响应头信息、cookies信息、响应体内容。
import requests base_url='http://httpbin.org' data={'key1': 'value1', 'key2': 'value2'} header={'User-Agent':"Mozilla/5.0"} r=requests.post(base_url+'/post',data=data, headers=header) #获取响应状态码 print(r.status_code) #获取响应头信息 print(r.headers) #将响应的cookies print(r.cookies) #获取响应内容 print(r.text) #将响应的内容以Json格式返回 print(r.json())
2.5、Post请求中发送数据
1、在Post请求中发送一些编码为表单形式的数据,要实现这个,只需简单地传递一个字典给data参数。你的数据字典在发出请求时会自动编码为表单形式,在Requests中用法如下:
import requests base_url='http://httpbin.org' data={'key1': 'value1', 'key2': 'value2'} r=requests.post(base_url+'/post',data=data) print(r.text)
返回结果如下:
2、还可以为 data
参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,
import requests base_url='http://httpbin.org' payload = (('key1', 'value1'), ('key1', 'value2')) r=requests.post(base_url+'/post',data=payload) print(r.text)
执行结果:
3、传递json数据:
import requests import json base_url='http://httpbin.org' payload = {'some': 'data'} r=requests.post(base_url+'/post',data=json.dumps(payload)) print(r.text)
运算结果:
三、Request的进阶
3.1、上传文件
Requests 使得上传多部分编码文件变得很简单
import requests base_url='http://httpbin.org' files = {'file': open('report.xls', 'rb')} r=requests.post(base_url+'/post',files=files) print(r.text)
执行结果
可以显式地设置文件名,文件类型和请求头:
import requests base_url='http://httpbin.org' files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} r=requests.post(base_url+'/post',files=files) print(r.text)
执行结果:
3.2、超时
你可以告诉 requests 在经过以 timeout
参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:
import requests base_url='http://httpbin.org' r=requests.get(base_url+'/get',timeout=0.01) print(r.text)
3.3、Cookie设置
cookie设置
import requests base_url='http://httpbin.org' cookie={'test':'test1234'} r=requests.get(base_url+'/cookies',cookies=cookie) print(r.text)
cookie获取
import requests r=requests.get('http://www.baidu.com') print(type(r.cookies)) print(r.cookies) for key,value in r.cookies.items(): print(key+':'+value)
执行结果:调用了 cookies 属性即可成功得到了 Cookies,可以发现它是一个 RequestCookieJar
类型,然后我们用 items()
方法将其转化为元组组成的列表,遍历输出每一个 Cookie 的名和值,实现 Cookies 的遍历解析。
3.4、保持会话对象
在接口测试过程中接口之间经常有依赖关系,比如下面这两个请求一个是设置Cookie
,另外一个是获取cookie
,在没有Session
保存机制的情况下,第二个接口无法获取第一个接口设置的Cookie
值。
Request的会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。具体使用如下:
import requests base_url='http://httpbin.org' #生成会话对象 s=requests.Session() #设置Cookie r=s.get(base_url+'/cookies/set/user/test') print(r.text) #获取Cookie r=s.get(base_url+'/cookies') print(r.text)
执行发现,两个请求的cookies是一样的。
3.5、SSL证书验证
Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError:
如果不想验证SSL则可以使用verify
参数关闭验证SSL。
import requests # r=requests.get('https://www.12306.cn') #关闭验证SSL r=requests.get('https://www.12306.cn',verify=False) print(r.text)
3.6、同域名,不同环境请求配置
当我们在实际过程中,可能会碰到域名相同,但是是部署在不同的服务器上,这个时候可以通过如下配置请求:
import requests #设置请求地址 test_url = "https://127.0.0.1:8000" pro_url = "https://192.168.48.63" #设置请求头域名 headers = {"Host":"test.ops.com"} r=requests.get(test_url+'/getPage.json',verify=False,headers=headers) print(r.text)