0%

Apifox实现接口前置脚本与后置脚本

Apifox实现接口前置脚本与后置脚本

环境变量配置

  • BASE_URL
  • username
  • password

Apifox 接口前置操作 - 自定义脚本:

当接口地址中包含 /login 字符时将不自动添加 Authorization 头。

当接口 Auth 设置为以下类型时,将不自动添加 Authorization 头:

  • Bearer Token :自定义 token。
  • No Auth:不需要身份认证。
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
var requestUrl = pm.request.url.getPath();
if (requestUrl.indexOf("/login") === -1 && pm.request.auth != undefined) {
if (pm.request.auth.type === "bearer" || pm.request.auth.type === "noauth") {
// 使用接口自定义的token值
return;
}

// 一开始想通过环境变量设置哪些需要添加token的接口,然后通过正则表达式进行匹配。
// 但发现正则表达式并不匹配。apifox中的动态正则表达式变量可能有问题。
// if (pm.globals.get("auth_url") === "") {
// return;
// }
// var authUrls = pm.globals.get("auth_url").split(",");
// var found = false;
// for(var i = 0; i < authUrls.length; i++) {
// if (authUrls[i] === requestUrl || requestUrl.indexOf(authUrls[i]) !== -1) {
// found = true;
// break;
// }
// if ((new RegExp(authUrls[i])).exec(requestUrl) !== null) {
// found = true;
// break;
// }
// }
// if (!found) {
// return;
// }

if (!pm.environment.get("username") || !pm.environment.get("password")) {
console.log("设置TOKEN失败,缺少鉴权环境变量:username、password")
return;
}

if (!pm.environment.get("authorization")
|| pm.environment.get("authorization") == "undefined"
|| (
pm.environment.get("expires_in")
&& (new Date().getTime()) > pm.environment.get("expires_in")
)
) {
pm.sendRequest({
url: pm.environment.get("BASE_URL") + "/login",
method: 'POST',
header: {
'isToken': false,
'Content-Type': 'application/json;charset=UTF-8'
},
body: {
mode: 'raw',// 此处为 raw
raw: JSON.stringify({ username: pm.environment.get("username"), password: pm.environment.get("password")}),
}
}
, function (err, response) {
var data = response.json();
if (data.token) {
pm.environment.set("authorization", data.token);
console.log("First add Authorization headers, requestUrl: " + requestUrl, data)
pm.request.headers.add({
key: 'Authorization',
value: "Bearer " + data.token
});
}
});
} else {
console.log("Add Authorization headers, requestUrl: " + requestUrl, pm.environment.get("authorization"))
pm.request.headers.add({
key: 'Authorization',
value: "Bearer " + pm.environment.get("authorization")
});
}
}

Apifox 接口后置操作 - 自定义脚本:

当响应的 JSON 数据中的 msg 包含 认证失败,无法访问系统资源 字符串时将自动设置最新 token 值。

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
pm.test("authorization 效验", function () {
var jsonData = pm.response.json();
if (jsonData.msg && jsonData.msg.indexOf("认证失败,无法访问系统资源") !== -1 && pm.request.auth != undefined) {
if (pm.request.auth.type === "bearer" || pm.request.auth.type === "noauth") {
var bearer = pm.request.auth.bearer.toJSON();
if (bearer[0].value !== pm.environment.get("authorization")) {
return;
}
}

if (!pm.environment.get("username") || !pm.environment.get("password")) {
console.log("设置TOKEN失败,缺少鉴权环境变量:username、password")
return;
}

pm.sendRequest({
url: pm.environment.get("BASE_URL") + "/login",
method: 'POST',
header: {
'isToken': false,
'Content-Type': 'application/json;charset=UTF-8'
},
body: {
mode: 'raw',// 此处为 raw
raw: JSON.stringify({ username: pm.environment.get("username"), password: pm.environment.get("password")}),
}
}
, function (err, response) {
var data = response.json();
if (data.token) {
console.log("设置新TOKEN", data)
pm.environment.set("authorization", data.token);
}
});
}
});