第二周_自动化接口测试:requests库使用
目录:
一. 第一周_接口手工测试:网络基础知识、抓包、Postman回顾,Pycharm安装教程和问题
二. Requests库介绍
三. 请求发送
四. 响应解析
五. 参数化
六. 断言
七. 其他(认证/关联/异步接口)
一、第一周_接口手工测试:网络基础知识、抓包、Postman回顾
Pycharm安装教程和问题
Pycharm安装教程
安装:https://www.cnblogs.com/QYGQH/p/7569769.html
第一步:打开界面
第二步:选择代码路径和Python解释器版本
第三步:设置Pycharm菜单字体的大小
第四步:设置编辑器里面字体大小
第五步:设置文件编码
第六步:设置背景颜色
第七步:设置tab键为4个空格
第八步:设置行号
第九步:设置控制台背景颜色
第十步:查看快捷键
快捷键使用:
1. Ctrl + D:复制当前行
2. Ctrl + Y:删除当前行
3. Ctrl + Z 撤销
4. Shift + Enter:快速换行
5. Ctrl + /:快速注释
6. Ctrl + F: 查找
7. Ctrl + H: 替换
8. Tab: 缩进
9. Shift + Tab:取消缩进
10. Ctrl +减号:折叠当前代码块
11. Ctrl +加号:展开当前代码块
12. Ctrl +Shift+减号:整个文件全部折叠
13. Ctrl +Shift+加号:整个文件全部展开
Pycharm常见问题
Pycharm专业版激活
1. 使用前将“0.0.0.0 account.jetbrains.com”添加到hosts文件中
2. 使用激活码激活
第一,Pycharm通过鼠标滚轮放大缩小字体
第二,安装第三方包
第三,避免导包问题,需要把将每一天的文件夹标记为"Sources Root"(标记代码目录为“源码目录”)
第四,使用pip在命令行中安装了包, 在Pycharm中导入报错
原因:Pycharm新建项目时默认使用虚拟环境,虚拟环境的包和“真实环境”的包是隔离的,使用pip默认安装到“真实环境”中,此时虚拟环境中是没有该包的
解决方法:在Pycharm设置安装包
第五,包/模块导入报错
解决方法:
1. 检查该文件或该目录下同级文件是否有和所导入包重名的文件
2. 个人使用的文件名不要和系统存在的包、三方包等重名,建议个人新建的文件使用两个以上英文单词,如requests_demo.py
二、Requests库介绍
Requests库介绍
Requests是一个非常简单容易使用的HTTP请求发送库,结构清晰,功能完善,非常容易上手。
安装方法
pip install requests
请求
请求方法: 用于发送不同的请求(GET/POST/PUT/…)
请求参数: 请求方法中的参数(url/params/data…)
响应
获取相应对象: res = requests.get(….) # 自定义一个变量res接收响应对象
响应解析: res.headers/res.status_code/res.text…
Requests库介绍: 请求方法
请求方法
res = requests.get(url, ...):发送get请求
requests.post(url,...):发送post请求
requests.put(url,...):发送put请求
......
requests.request(url, method,...): 通用的请求方法,支持各种请求
requests.session(): 用于保持会话(session)
除了requests.session()外,其他请求方法requests.get/post/put/...的参数都一样,都包含url,params, data, headers, cookies, files, auth, timeout等等
Requests库介绍: 请求参数
请求参数
url:字符串格式,参数也可以直接写到url中
params:url参数,字典格式
data:请求数据,字典或字符串格式(需手动编码和指定内容类型)
headers:请求头,字典格式
cookies:字典格式 (也可以使用字符串放在headers中)
files:字典格式,用于混合表单(form-data)中上传文件
auth:Basic Auth授权,数组格式 auth=(user,password)
timeout:超时时间(防止请求一直没有响应,最长等待时间),数字格式,单位为秒
proxy=():使用代理
verify=False :是否验证HTTPS证书,默认是True
参数的两种写法
requests.get(‘http://www.baidu.com’,{…}) # 只有url时可这样使用
requests.get(url=‘http://….’, params={}…) # 推荐格式
Requests库介绍: 响应解析
响应解析
res.status_code:响应的HTTP状态码
res.reason:响应的状态码含义
res.text:响应的文本格式,按res.encoding解码
res.content:响应的二进制格式
res.encoding:解码格式,可以通过修改res.encoding=‘utf-8‘来解决一部分中文乱码问题
res.apparent_encoding:真实编码,由charset库提供的明显编码
res.json():(注意,有括号),响应的json对象(字典)格式,慎用!如果响应文本不是合法的json文本,或报错
res.headers:响应头
res.cookies:响应的cookieJar对象,可以通过res.cookies.get(key)来获取响应cookies中某个key对应的值
# 1.导入requestsimport requests# 2.组装请求报文并发送response = requests.get(‘http://httpbin.org/get‘)# 3.解析响应print(response.status_code) # 状态码print(response.text) # 响应数据(文本格式)
写成函数形式:
# 1.导入requestsimport requests
# 练习1 get请求def get_01(): # 2.组装请求报文并发送 response = requests.get(‘http://httpbin.org/get‘) # 3.解析响应 print(response.status_code) # 状态码 print(response.text) # 响应数据(文本格式)get_01()
# 练习2 带参数get请求def get_02(): # url = ‘http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=你好‘ url = ‘http://www.tuling123.com/openapi/api‘ p = {‘key‘: ‘ec961279f453459b9248f0aeb6600bbe‘, ‘info‘: ‘你好‘} # 字典变量 response = requests.get(url, params=p) print(response.status_code) # 状态码 print(response.text) # 响应数据(文本格式)
get_02()
# 练习3 加法运算,带参数get请求def get_03(): url = ‘http://115.28.108.130:5000/add/‘ p = {‘a‘: 1, ‘b‘: 2} # 字典变量 response = requests.get(url, params=p) print(response.status_code) # 状态码 print(response.text) # 响应数据(文本格式)get_03()
# 练习4 post请求,纯文本表单格式def post_form01(): """纯文本表单格式Content-Type:application/x-www-form-urlencoded""" url = ‘http://115.28.108.130:5000/api/user/login/‘ data = { ‘name‘: ‘张三‘, ‘password‘: ‘123456‘ } # 字典类型的请求数据 response = requests.post(url, data=data) # data接受字典格式的数据是会进行url编码 print(response.text)post_form01()
# 练习5 post请求,纯文本表单格式def post_form02(): url = ‘http://httpbin.org/post‘ data = { ‘name‘: ‘kevin‘, ‘age‘: ‘21‘, ‘gender‘: ‘male‘ } response = requests.post(url, data=data) print(response.text)post_form02()
# 练习6def post_json03(): url = ‘http://115.28.108.130:5000/api/user/reg/‘ # 字典 True/False/None-->JSON true/false/null play_load = { "name": "张三", "password": "123456" } res = requests.post(url, json=play_load) print(res.text) # 响应的文本格式 print(res.json()) # 将响应文本转化为字典,只有当响应数据是json格式时才能转为字典,否则会报错 res_dict = res.json() print(res_dict[‘code‘]) print(res_dict[‘msg‘]) print(res_dict[‘data‘][‘name‘])post_json03()
# 练习7def add_card_json(): url = ‘http://115.28.108.130:8080/gasStation/process‘ play_load = { "dataSourceId": "bHRz", "methodId": "00A", "CardInfo": { "cardNumber": "0100020" } } response = requests.post(url, json=play_load) print(response.json()) print(response.text)add_card_json()
# 练习8def put_xml(): """发送xml格式的数据(发送原始格式的数据)""" url = ‘http://httpbin.org/put‘ play_load = ‘‘‘ <xml> <msg>hello</msg> </xml>‘‘‘ headers = {"Content-Type": "application/xml"} # 使用原始格式发送时应手动在请求头中指定内容类型 res = requests.put(url, data=play_load, headers=headers) # 当赋给data以字符串格式的话,会原样发送 print(res.json()) print(res.text)put_xml()
# 练习9"""三个双引号:用来作为函数的功能说明"""‘‘‘三个单引号:用于多行文本‘‘‘def post_json(): """发送json格式的数据(发送原始格式的数据)""" url = ‘http://115.28.108.130:5000/api/user/reg/‘ play_load = ‘‘‘{ "name": "张三", "password": "123456" }‘‘‘.encode(‘utf-8‘).decode(‘latin-1‘) headers = {"Content-Type": "application/json"} # 使用原始格式发送时应手动在请求头中指定内容类型 res = requests.post(url, data=play_load, headers=headers) # 当赋给data以字符串格式的话,会原样发送 print(res.json()) print(res.text)post_json()
# 练习10def post_file(): """上传文件接口""" url = ‘http://115.28.108.130:5000/api/user/uploadImage/‘ files = {‘file‘: open(r‘C:\Users\Administrator\Desktop\1.png‘, ‘rb‘)} # ‘rb‘是以2进制格式打开 res = requests.post(url=url, files=files) print(res.text)post_file()
# 练习11 发送请求并获取响应对象def get_baidu(): url = ‘https://www.baidu.com‘ res = requests.get(url) print(res.status_code, res.reason) # 200 OK # print(res.json()) # 会报错 print(res.text) # 文本格式,有乱码 print(res.content) # 二进制格式 print(res.encoding) # 查看解码格式 ISO-8859-1 print(res.apparent_encoding) # utf-8 res.encoding = ‘utf-8‘ # 手动设置解码格式为utf-8 print(res.text) # 乱码问题被解决 print(res.headers) # 会报错 print(res.cookies.items()) # cookies中的所有的项 [(‘BDORZ‘, ‘27315‘)] print(res.cookies.get("BDORZ")) # 获取cookies中BDORZ所对应的值 27315get_baidu()
# 练习12# 关联/接口依赖----------------------------------------def post_session(): """会话保持""" session = requests.session() # 新建一个会话 # 第一个请求---------------------------------------- url = ‘http://115.28.108.130:5000/api/user/login/‘ data = { ‘name‘: ‘张三‘, ‘password‘: ‘123456‘ } response = session.post(url, data=data) print(response.text) # 第二个请求---------------------------------------- url = ‘http://115.28.108.130:5000/api/user/getUserList‘ response = session.get(url) print(response.text)post_session()
# 练习14def post_cookies(): url = ‘http://115.28.108.130:5000/api/user/login/‘ data = { ‘name‘: ‘张三‘, ‘password‘: ‘123456‘ } response = requests.post(url, data=data) print(response.text) print(response.cookies) url = ‘http://115.28.108.130:5000/api/user/getUserList‘ response = requests.get(url, cookies=response.cookies) print(response.text)post_cookies()
三、请求发送
2
四、响应解析
3
五、参数化
1
六、断言
1
七、其他(认证/关联/异步接口)
1