一、Jasonpath的应用
JsonPath工具网站:JSONPath解析器 - 一个工具箱 - 好用的在线工具都在这里!
1、JSONPath的手写与获取
手写JSONPath
1、
$ (英文美元符号)代表外层的{}
. (英文句号)表示当前层级
1)$. 代表获取当前层级下的key
1.1)默认是最外层
$.name $.address
1.2)再里面一层,就再加一个 英文句号
$.address.city
2)$..代表获取任意层级的所有的这个Key
2.1)两个英文句号,代表任意层级的所有这个key
$..city
2.2)一个key里面有多个value(列表 [ ]),要使用..获取
$..hobbies
2.3)多个value 只取里面的一个值,就按列表的方式通过下标获取即可
2.4) 列表里面套元组,下标获取值
2.5) 列表里面套元组,切片符获取值
[0:]切片符,认为是从前面写的值0下标,默认到最后一个下标
2.6) 列表里面套元组,[*]代表列表里的所有下标
2.7) 列表里面套元组,表达式获取值
写在列表里面,?() 里面是表达式,@. 表示当前目录层级 key ==value是表达式的内容
2、通过代码实现获取JSONPath
1、先安装JSONPath的库
import jsonpath
格式:
jsonpath.jsonpath(data, "$.name")
data 是jsonpath对象
""里面是JSONPath的值
# 注意:
# 1. jsonpath处理的数据必须是字典格式
# 2. 报文的格式是json,必须进行数据的转换。
# 3. json.loads() 将json转换成字典类型
因为JSONPath是python的库,所以必须转化成python可以处理的类型
2、写代码
1)简单获取JSONPath
import jsonpath
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
}
],
"projects": [
{
"name": "Project A",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"contributors": ["John", "Sarah", "Mike"],
"completed": "true"
},
{
"name": "Project B",
"description": "Nulla vel sagittis elit. Vivamus auctor massa in lacinia pellentesque.",
"contributors": ["Alice", "David"],
"completed": "false"
}
],
"is_active": "true"
}
res1 = jsonpath.jsonpath(data, "$.name")
res2 = jsonpath.jsonpath(data, "$..year")
print(res1) # ['Alice']
print(res2) # [2018, 2020]
2) JSONPath断言
注意:
程序报错,代码运行结果断言不正确,要思考2方面
# 1. 当你觉得你的数据是一致的,那么就尝试打印出来看看--print()函数
# 2. 如果说打印出来还是一样的,考虑一下数据类型---type()函数
import jsonpath
import requests
url = "http://shop-xo.hctestedu.com?s=api/user/login"
public_data = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hami", "pwd": "123456", "type": "username"}
res = requests.request("post", url=url, params=public_data, data=data)
sj_res_code = jsonpath.jsonpath(res.json(), "$.code")[0]
print("实际结果sj:", sj_res_code)
print("实际结果类型:", type(sj_res_code))
qw_res_code = "0"
print("期望结果qw:", qw_res_code)
print("期望结果类型:", type(qw_res_code))
assert sj_res_code == qw_res_code, "结果不一致"
二、接口关联
什么是接口关联? 上一个接口的响应数据,做为下一个接口的请求数据。 关联-- jsonpath (提取响应数据的值)
一个业务(模块)逻辑包含这四个操作,做四件事情:增删改查。
用户登录模块:注册用户(新增),后台-删除用户(删除),修改个人信息(修改),用户列表(查询) 提交订单模块:提交订单(新增),后台-删除订单、用户-删除订单(删除),修改订单信息(修改),订单列表(查询) 购物车模块:加入购物车(新增),删除购物车(删除),修改商品规格(修改),购物车列表(查询列表) --- id--- XX列表
接口测试,一般都有的四个操作:增删改查
核心: 1. 一般接口都会有这个区分(没有经验的小伙伴一定要学会举一反三) 2. 查询一般是可以看对应详情【列表接口(带有一些主要的信息)、某个详情接口】
1、登录获取token
url = "http://shop-xo.hctestedu.com/index.php?s=/api/user/login"
params = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hami", "pwd": "123456", "type": "username"}
# 方法一:
res = requests.post(url=url, params=params, data=data)
# ----------------------------------------
# 获取响应数据
result = res.json()
print(f"响应结果是:{result}")
# 断言
sj_res = jsonpath.jsonpath(result, "$.msg")[0]
qw_res = "登录成功"
assert sj_res == qw_res, "结果不一致"
# 获取token数据
token = jsonpath.jsonpath(result, "$..token")[0]
print('token:',token)
2、使用token,加入购物车
import jsonpath
import requests
# 场景一:登录、加入购物车(谁加入购物车--某个人--某个人就涉及鉴权--需要拿到token)
url = "http://shop-xo.hctestedu.com/index.php?s=/api/user/login"
params = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hami", "pwd": "123456", "type": "username"}
# 登录请求:就下面这1行
res = requests.post(url=url, params=params, data=data)
# ----------------------------------------
# 获取响应数据
result = res.json()
print(f"响应结果是:{result}")
# 断言
sj_res = jsonpath.jsonpath(result, "$.msg")[0]
qw_res = "登录成功"
assert sj_res == qw_res, "结果不一致"
# 获取token数据
token = jsonpath.jsonpath(result, "$..token")[0]
print('token:',token)
# 接口一:加入购物车的接口
url = "http://shop-xo.hctestedu.com/index.php?s=/api/cart/save"
params = {"application": "app", "application_client_type": "weixin", "token": token}#token需要写到params里面
data = {
"goods_id": "11",
"spec": [
{
"type": "尺寸",
"value": "M"
}
],
"stock": "10"
}
# 添加购物车请求(用了登录请求的token):下面这2行
res = requests.post(url=url, params=params, data=data)
print(res.json())
三、加密算法--不一定非要自己写出来,AI即可
常见加密方式解析网站:AES加密解密
正常数据传送,如果再路由阶段,被修改请求,把查询余额改为转账,那么就完蛋了
通过HTTPS传输,协议权威,但是不一定绝对有效
自己加密
常见加密方式解析网站:AES加密解密
1、对称加密
对称加密:加密和解密方式是一样的。密钥相同(公钥)。两边规则一致
两边都有新华字典,代码是页数第几个字,就是一种密文
2、非对称加密
非对称加密:密钥不同(公私钥)
非对称加密非为:公钥(用来数据加密的)和私钥(用来解密操作,保持私密)
1)通过cmd打开jar包
打开cmd 默认是C盘,那么我们需要切到D盘
直接
D: 回车即可
然后在D盘打开某个文件夹,就是使用cd 命令。文件路径直接从电脑复制即可
cd过后,通过java -jar 包名 命令,启动jar包项目。 启动成功后,不要关闭窗口
然后,就可以访问接口文档了:http://127.0.0.1:8080/doc.html
打开文档:
进行调试,说明系统响应正确--非加密
加密的访问不通
知悉上面的加密规则
生成对应的加密数据--用户名和密码这些传参,都需要进行加密处理才行
生成的加密数据,再传参:加密网站:AES加密解密
解密
输出变输入。格式也互换
2)通过AI完成加解密算法工具
AI工具:文心一言
通过chatgpt生成 加密和解密的算法代码
老师提供的一些加密的demo
实例化的是密钥的对象
enc :加密
dec :解密
举例
通过AI的代码,修改,对我们登录的用户名和密码进行加密,然后将密文进行请求。生成token