APIFOX 设置前置脚本

日常工作中主要用 APIFOX 测试 API 接口,API 接口有很多需要鉴权的地方,如果每次都需要手动设置鉴权参数比较麻烦,可以利用官方提供的前置脚本功能设置鉴权的参数。前置脚本可以方便的使用 JS 语言编写。

官方文档:https://apifox.com/help/pre-post-processors-and-scripts/scripts/api-references/javascript-library

下面是一个示例,生成鉴权参数并设置请求头和请求参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
let secret = '鉴权密钥';

// 存放所有需要用来签名的参数
let param = {};

// 加入 query 参数
let queryParams = pm.request.url.query
queryParams.each((item) => {
if (!item.disabled && item.value !== '') {
// 启用且非空参数值的参数才参与签名
param[item.key] = item.value
}
})

// 加入 body 参数
if (pm.request.body) {
let formData;
switch (pm.request.body.mode) {
case 'formdata':
formData = pm.request.body.formdata;
break;
case 'urlencoded':
formData = pm.request.body.urlencoded;
break;
case 'raw':
// 如果没有 JSON 格式的请求 body,或 JSON 格式 body 不参与签名,可以删除这一段
let contentType = pm.request.headers.get('content-type');
if (
contentType
&& pm.request.body.raw
&& contentType.toLowerCase().indexOf('application/json') !== -1
) {
try {
let jsonData = JSON.parse(pm.request.body.raw);
/*
* 注意:通过脚本取出来的接口参数,如果参数包含变量,变量是不会替换成对应的值。如想要获取替换后的值,可使用`pm.variables.replaceIn`方法处理:
* let body = pm.variables.replaceIn(pm.request.body.raw);
* let jsonData = JSON.parse(body);
*/
for (let key in jsonData) {
let value = `${jsonData[key]}`; // 此处要注意如果值的实际类型不是 string 需要根据实际情况处理。
if (value !== '') { // 非空参数值的参数才参与签名
param[key] = value;
}
}
} catch (e) {
console.log('请求 body 不是 JSON 格式')
}
}
break;
default:
break;
}
if (formData) {
formData.each(item => {
if (!item.disabled && item.value !== '') { // 启用且非空参数值的参数才参与签名
param[item.key] = item.value;
}
});
}
}
// 添加鉴权接口需要的两个参数(个人项目需要)
param['_t'] = Math.floor(Date.now()/1000);
param['_s'] = 'ssss';
// 取 key
let keys = [];
for (let key in param) {
keys.push(key);
}

// 参数名 ASCII 码从小到大排序(字典序)
keys.sort();

// 转成键值对
let paramPair = [];
for (let i = 0, len = keys.length; i < len; i++) {
let k = keys[i];
paramPair.push(k + '=' + param[k])
}

// 拼接
let stringSignTemp = paramPair.join('&');
console.log(stringSignTemp);

let sign1 = CryptoJS.MD5(stringSignTemp).toString();
console.log(sign1);

let sign = CryptoJS.MD5(secret + sign1).toString();
console.log(sign);

// 设置请求头
pm.request.headers.add({ key: 'api-security', value: sign+""})
// 设置请求参数
queryParams.upsert({
key: '_t',
value: param['_t'] + ""
})
queryParams.upsert({
key: '_s',
value: param['_s']
})

可以在这里看到 console.log 打印的日志

在这里配置一个统一的前置脚本,方便子目录继承