目录
1.Requests中Session应用--Requests接口自动化关联
2.Requests接口自动化JsonPath应用
3.Requests接口自动化流程实战
1.Requests中Session应用
1.开发一个登录接口
python
from flask import Flask, request, jsonify, session
import os
app = Flask(__name__)
app.secret_key = os.urandom(24) # 设置一个密钥,用于加密 session 数据
# 模拟用户信息,实际项目中需要替换为真实的用户信息
users = {
'eurika': 'admin',
'admin': 'admin'
}
# 条件: 必须登录,才能获取信息
# 登录接口
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if username in users and users[username] == password:
session['logged_in'] = True
return 'Login successful', 200
else:
return 'Login failed', 401
2.开发一个查询信息接口
python
# 查询信息接口,需要登录才能访问
@app.route('/get_info')
def get_info():
if 'logged_in' in session and session['logged_in']:
# 用户已登录,返回用户信息
return 'User Info: OK' # 返回用户信息
else:
# 用户未登录,返回未授权的状态码
return 'Unauthorized', 401
3.添加主入口
ini
if __name__ == '__main__':
app.run(debug=True)
4.发送请求
ini
import requests
url_login ='http://127.0.0.1:5000/login'
data = {
'username': 'eurika',
'password': 'admin'
}
res = requests.post(url_login, json=data)
print("返回内容是:", res.text)
url_get_info = 'http://127.0.0.1:5000/get_info'
res = requests.get(url_get_info)
print("返回内容是:", res.text)
返回的结果是:

问题: 明明已经登录成功,为什么查询信息显示的是unauthorized的呢?
回答:
requests发送的每一个请求都是完全独立的
每次发送请求都会新打开一个浏览器
发送新的请求时不会记住发送之前请求时候的状态
解决方案:
鉴权
用同一个session(requests中的一个库)来保持会话状态
用session关联的对象,发送多个请求时,会自动关联cookie,并传递cookie
注:必须用同一个session发送请求(如果超过一个就会有问题)
如果是token鉴权,需要手带token手动传递
ini
url_login ='http://127.0.0.1:5000/login'
data = {
'username': 'eurika',
'password': 'admin'
}
session = requests.session()
res = session.post(url_login, json=data)
print("返回内容是:", res.text)
url_get_info = 'http://127.0.0.1:5000/get_info'
res = session.get(url_get_info)
print("返回内容是:", res.text)
2.Requests接口自动化JsonPath应用
-
jsonpath的使用-为了提取想要的数据
-
安装jsonpath
pip install jsonpath -i pypi.tuna.tsinghua.edu.cn/simple/
- jsonpath的语法规则:
-
$ 根节点,也是所有JsonPath表达式的开始
-
. 表示获取子节点
-
.. 表示获取所有符合条件的内容
-
- 代表所有的元素节点
-
index\] 表示迭代器的标示(可以用于处理下标等情况)
css
data={
"name": "Alice",
"age": 25,
"email": "alice@example.com",
"address": {
"street": "456 Elm Street",
"city": "Los Angeles",
"country": "USA"
},
"hobbies": ["reading", "traveling", "cooking"],
"education": [
{
"degree": "Bachelor's",
"major": "Computer Science",
"university": "ABC University",
"year": 2018
},
{
"degree": "Master's",
"major": "Business Administration",
"university": "XYZ University",
"year": 2020
}
], # $.education[0].year
"projects": [
{
"name": "Project A",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"contributors": ["John", "Sarah", "Mike"],
"completed": "true",
"year": 2021
},
{
"name": "Project B",
"description": "Nulla vel sagittis elit. Vivamus auctor massa in lacinia pellentesque.",
"contributors": ["Alice", "David"],
"completed": "false"
}
], # Sarah 怎么写?表达式 $.projects[0].contributors[1]
"is_active": "true"
}
找到email的值:
先取出列表:a=data.jsonpath.jsonpath(data,'$.email'}
再取出值:a[0]
找到projects中name为project A的值:
先取出列表:a=data.jsonpath.jsonpath(data,'$.projects[0].name')
再取出值:a[0]
3.Requests接口自动化实战
登录和购物车接口流程测试:
python
import requests
import jsonpath
# 登录接口
url_login= 'http://shop-xo.hctestedu.com/index.php?s=/api/user/login&application=app&application_client_type=weixin'
data1 ={
"accounts": "youyi",
"pwd": "123456",
"type": "username"
}
res1 = requests.post(url_login,data=data1)
#获取token
token = jsonpath.jsonpath(res1.json(),'$.data.token')[0]
print(res1.json())
print('token',token)
#购物车接口
# 字符串格式串
url_cart = f'http://shop-xo.hctestedu.com/index.php?s=/api/cart/save&application=app&application_client_type=weixin&token={token}'
data2 = {
"goods_id":"2",
"stock":"3"
}
res2 = requests.post(url_cart,data=data2)
print('购物车返回结果',res2.json())
这里也可以用session,如果是cookie,发送请求时浏览器会自动带cookie过去
如果是token,不会自动传值,需要手动带到url中传给浏览器
字符串格式串比较考察python基础:
1. 百分号格式化(%操作符)
ini
name = "小明"
age = 25
print("姓名:%s,年龄:%d" % (name,
age))
# 输出:姓名:小明,年龄:25
- %s :字符串占位符
- %d :整数占位符
- %f :浮点数占位符
2. str.format() 方法
ini
name = "小红"
score = 95.5
print("姓名:{},成绩:{:.1f}".format
(name, score))
# 输出:姓名:小红,成绩:95.5
- 使用 {} 作为占位符
- 支持位置参数和关键字参数
3. f-string(Python 3.6+推荐使用)
ini
name = "小刚"
height = 1.75
print(f"姓名:{name},身高:{height:.
2f}米")
# 输出:姓名:小刚,身高:1.75米
- 在字符串前加 f 前缀
- 直接在 {} 中写入变量或表达式