runner-runtime 1.0.58 → 1.0.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/events/api.js CHANGED
@@ -563,6 +563,21 @@ const convert2PostmanOptions = (request, option, variables) => {
563
563
  // 请求信息
564
564
  const { requestJson } = request;
565
565
 
566
+ // localVariables
567
+ const tmpLocalVariables = [];
568
+ _.forEach(_.get(variables, "variables"), (value, key) => {
569
+ tmpLocalVariables.push({
570
+ value,
571
+ key,
572
+ type: "any",
573
+ enabled: true,
574
+ });
575
+ });
576
+
577
+ const localVariables = new sdk.VariableScope({
578
+ values: tmpLocalVariables,
579
+ });
580
+
566
581
  // 创建迭代数据
567
582
  const iterationData = _.get(variables, 'iterationData');
568
583
  const data = [iterationData];
@@ -686,6 +701,7 @@ const convert2PostmanOptions = (request, option, variables) => {
686
701
  fileResolver: require("fs"),
687
702
  data,
688
703
  environment,
704
+ localVariables,
689
705
  globals,
690
706
  requester,
691
707
  systemProxy: async function (url, callback) {
@@ -2127,7 +2143,7 @@ module.exports = (event, option, callback, eventRuntimeData, eventResultList) =>
2127
2143
  }), options, (err, run) => {
2128
2144
  if (err) {
2129
2145
  reject({
2130
- action: 'stystemError',
2146
+ action: 'systemError',
2131
2147
  message: String(err),
2132
2148
  event_id: event?.event_id
2133
2149
  });
@@ -2144,7 +2160,9 @@ module.exports = (event, option, callback, eventRuntimeData, eventResultList) =>
2144
2160
  message: err?.message
2145
2161
  })
2146
2162
  if (scriptType === 'prerequest') {
2147
- run.abort();
2163
+ try {
2164
+ run.abort();
2165
+ } catch (e) { }
2148
2166
  }
2149
2167
  }
2150
2168
  }
@@ -2217,7 +2235,7 @@ module.exports = (event, option, callback, eventRuntimeData, eventResultList) =>
2217
2235
  })
2218
2236
  }
2219
2237
  }
2220
-
2238
+
2221
2239
  const requestOptions = convert2EchoRequest(request, requestJson, postmanJSON, history);
2222
2240
  _.set(eventRuntimeData, [event?.event_id, "request"], requestOptions);
2223
2241
 
@@ -2360,7 +2378,7 @@ module.exports = (event, option, callback, eventRuntimeData, eventResultList) =>
2360
2378
  }
2361
2379
  } catch (e) {
2362
2380
  reject({
2363
- action: 'stystemError',
2381
+ action: 'systemError',
2364
2382
  message: String(e),
2365
2383
  event_id: event?.event_id
2366
2384
  });
@@ -2375,7 +2393,7 @@ module.exports = (event, option, callback, eventRuntimeData, eventResultList) =>
2375
2393
  );
2376
2394
  } catch (e) {
2377
2395
  reject({
2378
- action: 'stystemError',
2396
+ action: 'systemError',
2379
2397
  message: String(e),
2380
2398
  event_id: event?.event_id
2381
2399
  });
package/events/index.js CHANGED
@@ -3,7 +3,7 @@ const atomicSleep = require("atomic-sleep"),
3
3
  aTools = require("apipost-tools"),
4
4
  JSON5 = require('json5'),
5
5
  _ = require('lodash'),
6
- { returnBoolean, variableReplaceForCondition, variableReplace, convertEndRuntimeState,repeatArrayToLength } = require('../libs/utils');
6
+ { returnBoolean, variableReplaceForCondition, variableReplace, convertEndRuntimeState, repeatArrayToLength } = require('../libs/utils');
7
7
  const executeApi = require('./api'),
8
8
  executeWait = require('./wait');
9
9
 
@@ -20,9 +20,22 @@ const events = {
20
20
  if: async (event, option, callback, eventRuntimeData, eventResultList) => { // ok
21
21
  try {
22
22
  const { data, children } = event;
23
+ const finalChildren = _.filter(children, (o) => {
24
+ return _.toInteger(o?.enabled > 0)
25
+ });
23
26
  const exp = variableReplaceForCondition(data?.var, eventRuntimeData?.variables, option),
24
27
  compare = data?.compare, value = variableReplaceForCondition(data?.value, eventRuntimeData?.variables, option);
25
28
  const isMatched = returnBoolean(exp, compare, value);
29
+
30
+ if (isMatched && _.isArray(finalChildren) && !_.isEmpty(finalChildren)) {
31
+ const { iterationData } = option, iterationDataArr = [iterationData];
32
+
33
+ // if (!_.isEmpty(iterationData) && _.isObject(iterationData)) {
34
+ // iterationDataArr = _.flatMap([iterationData], (element) => _.times(_.size(finalChildren), () => element));
35
+ // }
36
+ await iterationEvent(finalChildren, _.assign(_.cloneDeep(option), { iterationDataArr }), callback, eventRuntimeData, eventResultList)
37
+ }
38
+
26
39
  const runtimeState = convertEndRuntimeState(eventRuntimeData, event?.event_id) || {}
27
40
  const finalIfData = {
28
41
  action: 'request',
@@ -51,14 +64,9 @@ const events = {
51
64
 
52
65
  eventResultList.push(finalIfData?.data)
53
66
  callback(finalIfData);
54
-
55
- if (isMatched && _.isArray(children) && !_.isEmpty(children)) {
56
- const { iterationData } = option;
57
- await iterationEvent(children, _.assign(_.cloneDeep(option), { iterationDataArr: [iterationData] }), callback, eventRuntimeData, eventResultList)
58
- }
59
67
  } catch (e) {
60
68
  throw ({
61
- action: 'stystemError',
69
+ action: 'systemError',
62
70
  message: String(e),
63
71
  event_id: event?.event_id
64
72
  })
@@ -68,20 +76,31 @@ const events = {
68
76
  },
69
77
  begin: async (event, option, callback, eventRuntimeData, eventResultList) => { // ok
70
78
  try {
71
- const { data, children } = event;
72
-
73
- if (_.isArray(children) && !_.isEmpty(children)) {
74
- const { iterationData, enable_data } = data;
75
-
76
- if (_.toInteger(enable_data) > 0) {
77
- await iterationEvent(children, _.assign(_.cloneDeep(option), { iterationDataArr: iterationData }), callback, eventRuntimeData, eventResultList)
78
- } else {
79
- await iterationEvent(children, option, callback, eventRuntimeData, eventResultList)
80
- }
79
+ const { children } = event;
80
+ const finalChildren = _.filter(children, (o) => {
81
+ return _.toInteger(o?.enabled > 0)
82
+ });
83
+
84
+ if (_.isArray(finalChildren) && !_.isEmpty(finalChildren)) {
85
+ const { iterationData } = option, iterationDataArr = [iterationData];
86
+
87
+ // if (!_.isEmpty(iterationData) && _.isObject(iterationData)) {
88
+ // iterationDataArr = _.flatMap([iterationData], (element) => _.times(_.size(finalChildren), () => element));
89
+ // }
90
+
91
+ await iterationEvent(finalChildren, _.assign(_.cloneDeep(option), { iterationDataArr }), callback, eventRuntimeData, eventResultList)
92
+ // 分组不再支持测试数据(无实际意义),测试数据只针对循环单独设置
93
+ // const { iterationData, enable_data } = data;
94
+
95
+ // if (_.toInteger(enable_data) > 0) {
96
+ // await iterationEvent(finalChildren, _.assign(_.cloneDeep(option), { iterationDataArr: iterationData }), callback, eventRuntimeData, eventResultList)
97
+ // } else {
98
+ // await iterationEvent(finalChildren, option, callback, eventRuntimeData, eventResultList)
99
+ // }
81
100
  }
82
101
  } catch (e) {
83
102
  throw ({
84
- action: 'stystemError',
103
+ action: 'systemError',
85
104
  message: String(e),
86
105
  event_id: event?.event_id
87
106
  })
@@ -92,11 +111,15 @@ const events = {
92
111
  loop: async (event, option, callback, eventRuntimeData, eventResultList) => { // ok
93
112
  try {
94
113
  const { data, children } = event;
114
+ const finalChildren = _.filter(children, (o) => {
115
+ return _.toInteger(o?.enabled > 0)
116
+ })
117
+
95
118
  const sleep = _.toInteger(variableReplace(_.get(data, 'sleep', 0), eventRuntimeData?.variables, option));
96
119
  const startTime = _.toInteger(_.get(option, 'startTime', Date.now()));
97
120
  const timeout = _.toInteger(_.get(option, 'timeout', _.toInteger(variableReplace(_.get(data, 'loop_timeout', 0), eventRuntimeData?.variables, option))));
98
121
 
99
- if (_.isArray(children) && !_.isEmpty(children)) {
122
+ if (_.isArray(finalChildren) && !_.isEmpty(finalChildren)) {
100
123
  const iterationData = [];
101
124
  const enableData = _.toInteger(data?.enable_data) || 1;
102
125
 
@@ -217,7 +240,8 @@ const events = {
217
240
  iterationDataArr = repeatArrayToLength(iterationDataArr, limit)
218
241
  }
219
242
 
220
- const events = _.flatten(_.times(limit, () => _.cloneDeep(children)));
243
+ iterationDataArr = _.flatMap(iterationDataArr, (element) => _.times(_.size(finalChildren), () => element));
244
+ const events = _.flatten(_.times(limit, () => _.cloneDeep(finalChildren)));
221
245
  await iterationEvent(events, _.assign(_.cloneDeep(option), { iterationDataArr, sleep, startTime, timeout }), callback, eventRuntimeData, eventResultList)
222
246
  }
223
247
  } else if (_.includes([3], loopType)) {
@@ -226,7 +250,7 @@ const events = {
226
250
  const exp = variableReplaceForCondition(condition?.var, eventRuntimeData?.variables, option), compare = condition?.compare, value = variableReplaceForCondition(condition?.value, eventRuntimeData?.variables, option);
227
251
 
228
252
  if ((timeout === 0 || (timeout > 0 && startTime + timeout > Date.now())) && !returnBoolean(exp, compare, value)) {
229
- await iterationEvent(_.cloneDeep(children), _.assign(_.cloneDeep(option), { iterationDataArr: iterationData, sleep, condition, startTime, timeout }), callback, eventRuntimeData, eventResultList);
253
+ await iterationEvent(_.cloneDeep(finalChildren), _.assign(_.cloneDeep(option), { iterationDataArr: iterationData, sleep, condition, startTime, timeout }), callback, eventRuntimeData, eventResultList);
230
254
  } else {
231
255
  break;
232
256
  }
@@ -235,7 +259,7 @@ const events = {
235
259
  }
236
260
  } catch (e) {
237
261
  throw ({
238
- action: 'stystemError',
262
+ action: 'systemError',
239
263
  message: String(e),
240
264
  event_id: event?.event_id
241
265
  })
@@ -292,7 +316,6 @@ const iterationEvent = async (events, option, callback, eventRuntimeData, eventR
292
316
 
293
317
  if (_.isObject(event) && _.has(event, 'type') && _.toInteger(event?.enabled) > 0) {
294
318
  let { iterationDataArr } = option;
295
-
296
319
  if (!_.isArray(iterationDataArr)) {
297
320
  iterationDataArr = _.values(iterationDataArr);
298
321
  }
package/events/wait.js CHANGED
@@ -5,6 +5,11 @@ const { variableReplace, convertEndRuntimeState } = require("../libs/utils");
5
5
  module.exports = async (event, option, callback, eventRuntimeData, eventResultList) => {
6
6
  try {
7
7
  const sleep = _.toInteger(variableReplace(event?.data?.sleep, eventRuntimeData?.variables, option)) || 0;
8
+
9
+ if (sleep > 0) {
10
+ atomicSleep(sleep)
11
+ }
12
+
8
13
  const runtimeState = convertEndRuntimeState(eventRuntimeData, event?.event_id) || {}
9
14
  const finalWaitData = {
10
15
  action: 'request',
@@ -22,13 +27,9 @@ module.exports = async (event, option, callback, eventRuntimeData, eventResultLi
22
27
 
23
28
  eventResultList.push(finalWaitData?.data)
24
29
  callback(finalWaitData);
25
-
26
- if (sleep > 0) {
27
- atomicSleep(sleep)
28
- }
29
30
  } catch (e) {
30
31
  throw ({
31
- action: 'stystemError',
32
+ action: 'systemError',
32
33
  message: String(e),
33
34
  event_id: event?.event_id
34
35
  })
package/index.js CHANGED
@@ -3,14 +3,21 @@ const _ = require('lodash');
3
3
  const moment = require('moment');
4
4
  const aTools = require("apipost-tools");
5
5
  const { executeEvent, iterationEvent } = require('./events');
6
- const ABORT_RECURSION_ERROR = ['stystemError']; //需要跳出递归的错误
6
+ const ABORT_RECURSION_ERROR = ['systemError']; //需要跳出递归的错误
7
7
 
8
8
  // 执行场景
9
9
  const run = async (events, option, callback) => {
10
10
  const { iterationCount, iterationData, scene } = option;
11
+
12
+ if (scene == 'auto_test') {
13
+ events = _.filter(events, function (o) { return _.toInteger(o?.enabled) > 0; })
14
+ }
15
+
11
16
  const tempEvents = _.cloneDeep(_.flatten(new Array(scene == 'auto_test' ? _.max([_.toInteger(iterationCount), 1]) : 1).fill(events))) || [];
12
- const iterationDataArr = repeatArrayToLength(iterationData, _.size(tempEvents));
17
+ const iterationDataArr = _.flatMap(repeatArrayToLength(iterationData, _.max([_.toInteger(iterationCount), 1])), (element) => _.times(_.size(events), () => element));
13
18
  const eventOptions = _.pick(option, ["scene", "lang", "project", "env", "globals", "cookies", "system_configs", "custom_functions", "collection", "database_configs", "enable_sandbox", "sleep", "name", "testing_id"]);
19
+
20
+ // 初始化变量
14
21
  const eventRuntimeData = {
15
22
  variables: {
16
23
  environment: {},
@@ -18,20 +25,24 @@ const run = async (events, option, callback) => {
18
25
  globals: {},
19
26
  _globals: {},
20
27
  iterationData: {},
28
+ iterationDataArr: []
21
29
  }
22
30
  };
23
31
 
24
- // 初始化变量
25
- const tempVars = { environment: _.get(option, 'env.environment', {}), globals: _.get(option, 'globals', {}), iterationData: _.get(option, 'iterationData', []) };
32
+ const tempVars = { environment: _.get(option, 'env.environment', {}), globals: _.get(option, 'globals', {}), iterationDataArr };
26
33
 
27
- ['environment', 'globals', 'iterationData'].forEach((type) => {
34
+ ['environment', 'globals', 'iterationDataArr'].forEach((type) => {
28
35
  _.forEach(tempVars[type], (value, key) => {
29
36
  if (_.isUndefined(_.get(eventRuntimeData, ['variables', type, key]))) {
30
- _.set(eventRuntimeData, ['variables', type, key], value)
37
+ _.set(eventRuntimeData, ['variables', type, key], value);
38
+
39
+ if (type === 'globals') {
40
+ _.set(eventRuntimeData, ['variables', `_${type}`, key], value);
41
+ }
31
42
  }
32
43
  })
33
44
  })
34
-
45
+
35
46
  const eventResultList = [];
36
47
  const startTimeAt = Date.now();
37
48
 
package/libs/utils.js CHANGED
@@ -330,6 +330,10 @@ const variableReplace = (str, variables, option) => {
330
330
  }
331
331
 
332
332
  const variableReplaceForCondition = (str, variables, option) => {
333
+ if (!_.startsWith(str, '{{') || !_.endsWith(str, '}}')) {
334
+ return str;
335
+ }
336
+
333
337
  const AllVars = getInsideVariables();
334
338
  ["globals", "_globals", "environment", "variables"].forEach((varName) => {
335
339
  _.assign(AllVars, _.get(variables, `${varName}`))
@@ -338,13 +342,13 @@ const variableReplaceForCondition = (str, variables, option) => {
338
342
  str = _.replace(str, /\{\{([^}]+)\}\}/g, (match, key) => {
339
343
  return _.get(AllVars, key.trim(), match);
340
344
  });
341
- console.log(str, `strstrstrstrstrstr`)
345
+
342
346
  const { lang, custom_functions } = option;
343
347
 
344
348
  try {
345
349
  const finalStr = mockExp(str, AllVars, lang, custom_functions);
346
350
 
347
- if (finalStr === str) {
351
+ if (finalStr === str && _.startsWith(str, '{{') && _.endsWith(str, '}}')) {
348
352
  return undefined
349
353
  }
350
354
  return finalStr;
@@ -522,12 +526,13 @@ const convertEndRuntimeState = (eventRuntimeData, event_id) => {
522
526
  ["variables", "iterationData", "environment", "globals"].some((type) => {
523
527
  if (!_.isUndefined(_.get(startVariables, [`${type}`, key]))) {
524
528
  startActedUpon = type;
525
- return;
529
+ return true;
526
530
  }
527
531
  })
528
532
  }
529
533
  _.set(startAllActedUponVars, [key, 'actedUpon'], startActedUpon);
530
534
  })
535
+
531
536
  // 当前变量
532
537
  const { environment = {}, variables = {}, _globals = {}, iterationData = {} } = _.get(eventRuntimeData, 'variables', {});
533
538
  const endVariables = { environment, variables, iterationData, globals: _globals };
@@ -541,15 +546,12 @@ const convertEndRuntimeState = (eventRuntimeData, event_id) => {
541
546
 
542
547
  _.forEach(endAllVars, (value, key) => {
543
548
  let actedUpon = undefined;
544
-
545
- // if (_.get(startAllVars, key) != value) {
546
549
  ["variables", "iterationData", "environment", "globals"].some((type) => {
547
550
  if (!_.isUndefined(_.get(endVariables, [`${type}`, key]))) {
548
551
  actedUpon = type;
549
- return;
552
+ return true;
550
553
  }
551
554
  })
552
- // }
553
555
 
554
556
  _.set(currentVariables, [key], {
555
557
  start: _.pick(startAllActedUponVars[key], ['value', 'actedUpon']),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runner-runtime",
3
- "version": "1.0.58",
3
+ "version": "1.0.59",
4
4
  "description": "runner-runtime.",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/tmp/request.js CHANGED
@@ -1,9 +1,7 @@
1
- module.exports ={
1
+ module.exports = {
2
2
  "option": {
3
3
  "scene": "auto_test",
4
- "globals": {
5
- "全局": "AAAA"
6
- },
4
+ "globals": {},
7
5
  "project": {
8
6
  "request": {
9
7
  "header": {
@@ -48,11 +46,7 @@ module.exports ={
48
46
  "parameter": []
49
47
  },
50
48
  "auth": {
51
- "type": "basic",
52
- "basic": {
53
- "username": "mengyu",
54
- "password": "meinv"
55
- }
49
+ "type": "noauth"
56
50
  },
57
51
  "pre_tasks": [],
58
52
  "post_tasks": []
@@ -64,28 +58,22 @@ module.exports ={
64
58
  "env_pre_url": "",
65
59
  "env_pre_urls": {
66
60
  "1": {
67
- "sort": 200,
68
- "name": "默认服务",
69
61
  "server_id": "1",
70
- "server_type": 1,
62
+ "name": "默认服务",
63
+ "sort": 1000,
71
64
  "uri": ""
72
65
  },
73
66
  "default": {
74
- "sort": 200,
75
- "name": "默认服务",
76
67
  "server_id": "1",
77
- "server_type": 1,
68
+ "name": "默认服务",
69
+ "sort": 1000,
78
70
  "uri": ""
79
- },
80
- "1a89a49bc9808001": {
81
- "sort": 600,
82
- "name": "服务2",
83
- "server_id": "1a89a49bc9808001",
84
- "server_type": -1,
85
- "uri": "go.apipost.cn"
86
71
  }
87
72
  },
88
- "environment": {}
73
+ "environment": {
74
+ "code": 201,
75
+ "key": "value"
76
+ }
89
77
  },
90
78
  "cookies": {
91
79
  "switch": 1,
@@ -98,11 +86,11 @@ module.exports ={
98
86
  "path": "/",
99
87
  "secure": true,
100
88
  "httpOnly": true,
101
- "creation": "2025-04-21T08:44:38.530Z",
89
+ "creation": "2025-04-23T18:21:01.716Z",
102
90
  "name": "liveCookie",
103
- "cookie_id": "4f9eb773ab1cf",
104
- "expires": "Mon, 21 Apr 2025 08:46:39 GMT",
105
- "project_id": "1a89866533408002"
91
+ "cookie_id": "cfbb441f1704b",
92
+ "expires": "Wed, 23 Apr 2025 18:23:04 GMT",
93
+ "project_id": "2adc267c9064000"
106
94
  },
107
95
  {
108
96
  "key": "loseCookie",
@@ -112,77 +100,33 @@ module.exports ={
112
100
  "path": "/",
113
101
  "secure": true,
114
102
  "httpOnly": true,
115
- "creation": "2025-04-21T08:44:38.531Z",
103
+ "creation": "2025-04-23T18:21:01.716Z",
116
104
  "name": "loseCookie",
117
- "cookie_id": "4f9eb773ab1d0",
118
- "expires": "Mon, 21 Apr 2025 08:44:39 GMT",
119
- "project_id": "1a89866533408002"
120
- },
121
- {
122
- "key": "security_session_verify",
123
- "value": "4560bdb4c5ddc22643bc99515ea21fcf",
124
- "expires": "2025-04-21T13:42:33.000Z",
125
- "path": "/",
126
- "httpOnly": true,
127
- "creation": "2025-04-18T05:42:33.287Z",
128
- "name": "security_session_verify",
129
- "cookie_id": "60289db7ab003",
130
- "domain": "echo.apipost.cn",
131
- "project_id": "1a89866533408002"
132
- },
133
- {
134
- "key": "security_session_verify",
135
- "value": "4560bdb4c5ddc22643bc99515ea21fcf",
136
- "expires": "2025-04-21T13:42:29.000Z",
137
- "path": "/",
138
- "httpOnly": true,
139
- "creation": "2025-04-18T05:42:30.039Z",
140
- "name": "security_session_verify",
141
- "cookie_id": "60289db7ab004",
142
- "domain": "echo.apipost.cn",
143
- "project_id": "1a89866533408002"
144
- },
145
- {
146
- "key": "security_session_verify",
147
- "value": "4560bdb4c5ddc22643bc99515ea21fcf",
148
- "expires": "2025-04-21T13:42:29.000Z",
149
- "path": "/",
150
- "httpOnly": true,
151
- "creation": "2025-04-18T05:42:30.040Z",
152
- "name": "security_session_verify",
153
- "cookie_id": "60289db7ab005",
154
- "domain": "echo.apipost.cn",
155
- "project_id": "1a89866533408002"
156
- },
157
- {
158
- "key": "BDSVRTM",
159
- "value": "0",
160
- "path": "/",
161
- "creation": "2025-04-18T08:04:03.277Z",
162
- "name": "BDSVRTM",
163
- "cookie_id": "602acf0fab006",
164
- "domain": "www.baidu.com",
165
- "project_id": "1a89866533408002"
105
+ "cookie_id": "cfbb441f1704c",
106
+ "expires": "Wed, 23 Apr 2025 18:21:04 GMT",
107
+ "project_id": "2adc267c9064000"
166
108
  }
167
109
  ]
168
110
  },
169
111
  "system_configs": {
170
112
  "send_timeout": 0,
171
- "auto_redirect": -1,
113
+ "auto_redirect": 1,
172
114
  "max_redirect_time": 5,
173
- "auto_gen_mock_url": 1,
174
- "request_param_auto_json": -1,
115
+ "auto_gen_mock_url": -1,
116
+ "request_param_auto_json": 1,
175
117
  "proxy": {
176
118
  "type": 2,
177
- "envfirst": 1,
178
- "bypass": [],
119
+ "envfirst": -1,
120
+ "bypass": [
121
+ "export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890"
122
+ ],
179
123
  "protocols": [
180
- "http",
181
- "https"
124
+ "https",
125
+ "http"
182
126
  ],
183
127
  "auth": {
184
128
  "authenticate": -1,
185
- "host": "123.57.241.61:3128",
129
+ "host": "127.0.0.1:7890",
186
130
  "username": "",
187
131
  "password": ""
188
132
  }
@@ -190,219 +134,334 @@ module.exports ={
190
134
  "ca_cert": {
191
135
  "open": 1,
192
136
  "path": "",
193
- "base64": ""
137
+ "base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lKQU9ueUNxV09FeCtsTUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlYKQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BUYjIxbExWTjBZWFJsTVNFd0h3WURWUVFLRXhoSmJuUmxjbTVsZENCWAphV1JuYVhSeklGQjBlU0JNZEdRd0hoY05NVFV3TnpFek1UUTFNRE16V2hjTk1UVXdPREV5TVRRMU1ETXpXakJGCk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQk1LVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2hNWVNXNTAKWlhKdVpYUWdWMmxrWjJsMGN5QlFkSGtnVEhSa01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQTB1cVdPWUF1ZmgxSHZkNUw0WE8zUEZOZituZE8vVGczUGJEcWl4UTZEYUpqcUw2ZWh6eFJYeHJyCmR6U0N6RlN2b2FPRzFNaUpyazlIdUYvYUVyZ0ExdHFnb0crSmx1VVlKOG9VNzRtVFk3Zmt3dHhPUnpoT2JkSmoKbFoxNm5jNGVEaXBjVWtjUFluY0tQSGxsbnR1MXVDSUNNMkl5TmprcUFNd3lPSERrTGNFY0VyQ1F3YVdlSi80VgpGS3NVdndwbTR0cmRwWVcrelUwWkhUdWtuWkhybERrY1l2ZlE2VSt5bjI3ZEZBUWRwb3A5Q0FyNjdsL2Ftd01RCm9ZT1hqVGx6bWFZOURvRHRVazlCY0tGSUhhVDQwbGJFSDV2OTlXeDNaNE1MQ2JhNHRuQ2oyRTFzZ2UrUWFWcEEKck1aazNDTjN0amM5VUlWa2JGdUZmeUNaK1owSlpRSURBUUFCbzRHbk1JR2tNQjBHQTFVZERnUVdCQlNzandwVAp6Q2YzOGhUQmNsRFNvWEFNSkp6Q1NEQjFCZ05WSFNNRWJqQnNnQlNzandwVHpDZjM4aFRCY2xEU29YQU1KSnpDClNLRkpwRWN3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbE52YldVdFUzUmhkR1V4SVRBZkJnTlYKQkFvVEdFbHVkR1Z5Ym1WMElGZHBaR2RwZEhNZ1VIUjVJRXgwWklJSkFPbnlDcVdPRXgrbE1Bd0dBMVVkRXdRRgpNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJSk52M3cza0VqSGt5QkNiaURwcFFBczdDU2s1SGJzCisrV0EyZm9sdzZaM3I2SUxHWEpVYmhwaitQZ0V1YTVUTW5ja2VEL0lvMXViYnNqaWZ2eHo1UUJrTDIySHQwdkIKTFJpR1FkMGt2TTFUUkFTUyt2UFk1L096Q2hkUVFPamh0UG5Vc0h2dEVwTHV5SkRlV2QyZTV5cFoveDdmMTZRVApwRG16ajRLNG00YkZPUitSWlQxUkN2SjFDclU1VWR0UzBpWVoyczJmVVJJclQ3Qmo5dDhhdmpReTFxQnNzd1E1CkdFUERTRWVoRC96QzkzMlJsSUw4cGhja05kTHRvZGlMaVlSRU8rTGt6MHdDeWpVTG0vYXVMeWlrNzZ1WlZaR3gKTEJwRUp4WU81bmQvYVViYjNsS3liSXJZYXlkSWJBVk5CcWR1SWxaV3M1cmgwclJFOUZNaDcrbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
194
138
  },
195
139
  "client_cert": {
196
- "https://cc.apipost.cc:6003": {
140
+ "https://*:443": {
141
+ "crt": {
142
+ "file_base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuVENDQW9VQ0ZFcDd4Z3J2VVhteWEzTEdmcEFpenRNUkJvN3ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0sKTVFzd0NRWURWUVFHRXdKRFRqRVFNQTRHQTFVRUNBd0hRbVZwYW1sdVp6RVFNQTRHQTFVRUJ3d0hRbVZwYW1sdQpaekVRTUE0R0ExVUVDZ3dIWVhCcGNHOXpkREVNTUFvR0ExVUVDd3dEWVhCME1SWXdGQVlEVlFRRERBMWpZeTVoCmNHbHdiM04wTG1Oak1SOHdIUVlKS29aSWh2Y05BUWtCRmhCaFpHMXBia0JoY0dsd2IzTjBMbU5qTUI0WERUSXoKTVRJeE1UQTVOREl4TmxvWERUTXpNVEl3T0RBNU5ESXhObG93Z1lveEN6QUpCZ05WQkFZVEFrTk9NUkF3RGdZRApWUVFJREFkQ1pXbHFhVzVuTVJBd0RnWURWUVFIREFkQ1pXbHFhVzVuTVE4d0RRWURWUVFLREFaaGNHbHZjM1F4CkREQUtCZ05WQkFzTUEyRndkREVXTUJRR0ExVUVBd3dOWTJNdVlYQnBjRzl6ZEM1all6RWdNQjRHQ1NxR1NJYjMKRFFFSkFSWVJZMnhwWlc1MFFHRndhWEJ2YzNRdVkyTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRG5DalNwV2MvVEovcXg2ZHRCRUlKeHhpME0wTWc1M091U0lNK2dMVnNseTl4SVFTTndGWGhrCi8vRzhTOVl0d2lnMHpwZVNLUlhyNi9tdklQcjlsY3RBakRrZzQ4Q1BQSk5YYVo1RTdQVkRYbThtTXhhS2RBeXEKZVBkT2w2bGJ0a0pWRTB0cElWTFo4UkhEOWU4VFdiNENMNFBUSzkrNFhVSElEUU1FTUdNbWFnRUVRd3ordDdSTQpMZDVvcVAxdHVUdlhBbmlUbmU4TnZhYVQ3NDlqcFhYb3lnV29FaVcwOGJ3NmI2TmZwVVEyeFBsSkdrc2tiblRhCisyTWVqb1ZrSlpDbDFlOUhOYXV2a085WjhQamRYMG9nZTM0OE5pZW83amNDWWhBUmttanVJanhiMU1kU3dPdjcKMTVWS3EwcFFwbjNzVHJrWTVqdjZEeis3dWhSaXVnN2pBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQgpBRGFCdG10NHVPaVpoVlpHdmo1Tko2RUhUUFNGZGxBaVd6U2tiSWllV2RIY1NhK0J3K2xBM1kyalJsYnZNUVVaCndiL21jaFRtNjFJRmlKbnYvN1h2MGtmMkJxUzkyMURXenJHa3FWQk5zRUdIMEdhWGVHMVMwL1pkNXg1RE4zMlEKRW9IRE95K2lOeDlwRzA2cy8ybUlGY1E3eXQ0cW9acXFQZUg4U3VIamZOanlnZnZFUGxiYUJHb0Y4V1dneFluLwp3TzlFK2pYN3VvdlZDWXVrY3NyaEprZzJwK3o5MUFVU3p2NlpTbHlnK3pGM2kyM1Q0ZXA5VDhwRTV2eXE3UlFnClNPT3BQd25uN0d5UWd2UzREbU5LMHkyazc5ZUdGb3VnTWxnS3g1Um5nMUQxNEd0ZFcvMlE0WGxNa2tHZ1ZsR2IKRVRkcGlES1JKWjNTTDJPZ1RsSFpibWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
143
+ "file_name": "client (1).crt",
144
+ "file_url": ""
145
+ },
146
+ "key": {
147
+ "file_base64": "",
148
+ "file_name": "",
149
+ "file_url": ""
150
+ },
197
151
  "password": "",
152
+ "pfx": {
153
+ "file_base64": "",
154
+ "file_name": "",
155
+ "file_url": ""
156
+ },
157
+ "HOST": "https://*:443"
158
+ },
159
+ "https://apipost.cn:443": {
198
160
  "crt": {
199
161
  "file_url": "",
200
162
  "file_base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuVENDQW9VQ0ZFcDd4Z3J2VVhteWEzTEdmcEFpenRNUkJvN3ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0sKTVFzd0NRWURWUVFHRXdKRFRqRVFNQTRHQTFVRUNBd0hRbVZwYW1sdVp6RVFNQTRHQTFVRUJ3d0hRbVZwYW1sdQpaekVRTUE0R0ExVUVDZ3dIWVhCcGNHOXpkREVNTUFvR0ExVUVDd3dEWVhCME1SWXdGQVlEVlFRRERBMWpZeTVoCmNHbHdiM04wTG1Oak1SOHdIUVlKS29aSWh2Y05BUWtCRmhCaFpHMXBia0JoY0dsd2IzTjBMbU5qTUI0WERUSXoKTVRJeE1UQTVOREl4TmxvWERUTXpNVEl3T0RBNU5ESXhObG93Z1lveEN6QUpCZ05WQkFZVEFrTk9NUkF3RGdZRApWUVFJREFkQ1pXbHFhVzVuTVJBd0RnWURWUVFIREFkQ1pXbHFhVzVuTVE4d0RRWURWUVFLREFaaGNHbHZjM1F4CkREQUtCZ05WQkFzTUEyRndkREVXTUJRR0ExVUVBd3dOWTJNdVlYQnBjRzl6ZEM1all6RWdNQjRHQ1NxR1NJYjMKRFFFSkFSWVJZMnhwWlc1MFFHRndhWEJ2YzNRdVkyTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRG5DalNwV2MvVEovcXg2ZHRCRUlKeHhpME0wTWc1M091U0lNK2dMVnNseTl4SVFTTndGWGhrCi8vRzhTOVl0d2lnMHpwZVNLUlhyNi9tdklQcjlsY3RBakRrZzQ4Q1BQSk5YYVo1RTdQVkRYbThtTXhhS2RBeXEKZVBkT2w2bGJ0a0pWRTB0cElWTFo4UkhEOWU4VFdiNENMNFBUSzkrNFhVSElEUU1FTUdNbWFnRUVRd3ordDdSTQpMZDVvcVAxdHVUdlhBbmlUbmU4TnZhYVQ3NDlqcFhYb3lnV29FaVcwOGJ3NmI2TmZwVVEyeFBsSkdrc2tiblRhCisyTWVqb1ZrSlpDbDFlOUhOYXV2a085WjhQamRYMG9nZTM0OE5pZW83amNDWWhBUmttanVJanhiMU1kU3dPdjcKMTVWS3EwcFFwbjNzVHJrWTVqdjZEeis3dWhSaXVnN2pBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQgpBRGFCdG10NHVPaVpoVlpHdmo1Tko2RUhUUFNGZGxBaVd6U2tiSWllV2RIY1NhK0J3K2xBM1kyalJsYnZNUVVaCndiL21jaFRtNjFJRmlKbnYvN1h2MGtmMkJxUzkyMURXenJHa3FWQk5zRUdIMEdhWGVHMVMwL1pkNXg1RE4zMlEKRW9IRE95K2lOeDlwRzA2cy8ybUlGY1E3eXQ0cW9acXFQZUg4U3VIamZOanlnZnZFUGxiYUJHb0Y4V1dneFluLwp3TzlFK2pYN3VvdlZDWXVrY3NyaEprZzJwK3o5MUFVU3p2NlpTbHlnK3pGM2kyM1Q0ZXA5VDhwRTV2eXE3UlFnClNPT3BQd25uN0d5UWd2UzREbU5LMHkyazc5ZUdGb3VnTWxnS3g1Um5nMUQxNEd0ZFcvMlE0WGxNa2tHZ1ZsR2IKRVRkcGlES1JKWjNTTDJPZ1RsSFpibWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
201
163
  "file_name": "client (1).crt"
202
164
  },
203
165
  "key": {
204
- "file_url": "",
205
- "file_base64": "data:application/x-iwork-keynote-sffkey;base64,LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBNXdvMHFWblAweWY2c2VuYlFSQ0NjY1l0RE5ESU9kenJraURQb0MxYkpjdmNTRUVqCmNCVjRaUC94dkV2V0xjSW9OTTZYa2lrVjYrdjVyeUQ2L1pYTFFJdzVJT1BBanp5VFYybWVST3oxUTE1dkpqTVcKaW5RTXFuajNUcGVwVzdaQ1ZSTkxhU0ZTMmZFUncvWHZFMW0rQWkrRDB5dmZ1RjFCeUEwREJEQmpKbW9CQkVNTQovcmUwVEMzZWFLajliYms3MXdKNGs1M3ZEYjJtaysrUFk2VjE2TW9GcUJJbHRQRzhPbStqWDZWRU5zVDVTUnBMCkpHNTAydnRqSG82RlpDV1FwZFh2UnpXcnI1RHZXZkQ0M1Y5S0lIdCtQRFlucU80M0FtSVFFWkpvN2lJOFc5VEgKVXNEcis5ZVZTcXRLVUtaOTdFNjVHT1k3K2c4L3U3b1VZcm9PNHdJREFRQUJBb0lCQUNXckQwenhIS1lqcFlidQpSdFlEMkJDdXE5ZWtEcEVJaU12SlY3Q1kxSHlFRVVVaWdhR2Jqb2FCQ0N1WC9iSjJMbEgxd05hT3BrbFJydUt6CnNOZzVYT3NJTWFSQUhidjh0MVVRSGtMRWszUkphRHZGSm82cVB3cG9NSUg2emh6cXlVUFBvb0xnY1A2aGhERDcKM3QrN3lQUFlSVmpmbFZrY3MwWG5nUzlrcURXeDBXZStWOGFJMVJCOXVIbUdDcmo4djFZaHFSRWl2dXl4eUVXQwpZSkowVFRqSVhtMC92OVNJRE5FTjJKVExkYmlIdDBvQm9PZk1CWk5MSmhjSWI4cHkvTW5SYW9IN1EvN2VZQllQClNnMzJycXYvZlNjZGhWakltbTNyWEtaclV5NlErcUpNNGp1MCtpV0E4MzRzd2NiaGZhbU5XR2tLcUYzVmo4WEEKendGbkVjRUNnWUVBK056RHpxb3Vlbk9iZE5ORTdFa2FaTDc4TFFlL0VhTkYycHlhS2IvWTFac2F5U2ozSUMxbAp2RCs0V1hQamZJVWl3SldGeEtONGZyVnlldCtZWGhOZ0p3eU9wb2gyZmlaNzExR0paSWRudGFDV3lmRnpGVS8rClZQUm1yUUxIWS9MNHRhdnByTzlhTHBYVWVSYlc0NXVBbUZ5YUtJck1qSkFzMnFpeitKYUxGbUVDZ1lFQTdhcVUKOEE5SHpkVDFsQzB1ZlRoNG1Cdm43enpvSXJHNmY3amhvRVZuazEwWmozKy9pNEFmWEw3VHRuQmtXaTJvZElKbApDb2ZXdGRWbUxvTkhpOER0ZldyWFkzOWhra0ZSSEo5Y01qNEozcEJmaVp0ZUJyaFhucDg1c0xDS0pnWGVNZDNEClhkZVl1TERuczR3Y3FZTnpkbDRQL2cvRGl5RFB5Y29tc3NmdzQ4TUNnWUVBc2pUVWVwOWZIUXpBRzQ1V1lxV08Kb3Vvb2hzNXZRbUFhMjRzYzBoeXhWM1QwWDJ4WVd0Qm5jOEJsY0prT0k5THFxZUhvb29FMC9mZE0vVFEwVmRtbQpGeEJrN2xmMkVpdllycjJTbDB4bk5hYkRrK1MwdG1STUNlWGh5SzZldmJIMTY1SXBpVTcwMHpzenBXcDNneEdOCnFvMVZUd2JscHhwdkpEMStjdHJLeXNFQ2dZRUFyMlo0T3Q4Y0lCVnVGS2h2cWV5Mlc1UWt6UlJIUWV1bTkwSU0KQ2t1T2tGeGlVOXgxRWRCQjFTSGtmNzFjNG96VnlQNis4VkdsTFZkTDdVSG4ySVZQQUlPTWFKc0crSGlLRXpTdApSMHN2MzNqdmVWQVh5Wi9jMG0weWwyc0MyZUwweEJxbFo2bUl4YTJSb3BuaVFWeUpKeTl1WUJOa1BsYTk0Mi8wCnRYY0lHaDhDZ1lCbHJBaVdIOGU4aEhkWjdxTjNOTk51cVkvQjdJWFNPdzFIMEVKbjd3Ui9tZElzalFRYkJGL3gKa05YNndvZDVFeHBzRkVER2lJQ0RiQm1FbW5oaU1TWFBXREhoalZKSkFSUG5sL2Fxc0tNemt0dXdic29DbGQ2OApkT1hkbHNtbGhYZVdrcGp5ZUdCREZ5Y3hPdW80M3F6VzdOOUNpQ285dXBuNGZrSEg3Si95Znc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=",
206
- "file_name": "client (1).key"
166
+ "file_base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lKQU9ueUNxV09FeCtsTUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlYKQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BUYjIxbExWTjBZWFJsTVNFd0h3WURWUVFLRXhoSmJuUmxjbTVsZENCWAphV1JuYVhSeklGQjBlU0JNZEdRd0hoY05NVFV3TnpFek1UUTFNRE16V2hjTk1UVXdPREV5TVRRMU1ETXpXakJGCk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQk1LVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2hNWVNXNTAKWlhKdVpYUWdWMmxrWjJsMGN5QlFkSGtnVEhSa01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQTB1cVdPWUF1ZmgxSHZkNUw0WE8zUEZOZituZE8vVGczUGJEcWl4UTZEYUpqcUw2ZWh6eFJYeHJyCmR6U0N6RlN2b2FPRzFNaUpyazlIdUYvYUVyZ0ExdHFnb0crSmx1VVlKOG9VNzRtVFk3Zmt3dHhPUnpoT2JkSmoKbFoxNm5jNGVEaXBjVWtjUFluY0tQSGxsbnR1MXVDSUNNMkl5TmprcUFNd3lPSERrTGNFY0VyQ1F3YVdlSi80VgpGS3NVdndwbTR0cmRwWVcrelUwWkhUdWtuWkhybERrY1l2ZlE2VSt5bjI3ZEZBUWRwb3A5Q0FyNjdsL2Ftd01RCm9ZT1hqVGx6bWFZOURvRHRVazlCY0tGSUhhVDQwbGJFSDV2OTlXeDNaNE1MQ2JhNHRuQ2oyRTFzZ2UrUWFWcEEKck1aazNDTjN0amM5VUlWa2JGdUZmeUNaK1owSlpRSURBUUFCbzRHbk1JR2tNQjBHQTFVZERnUVdCQlNzandwVAp6Q2YzOGhUQmNsRFNvWEFNSkp6Q1NEQjFCZ05WSFNNRWJqQnNnQlNzandwVHpDZjM4aFRCY2xEU29YQU1KSnpDClNLRkpwRWN3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbE52YldVdFUzUmhkR1V4SVRBZkJnTlYKQkFvVEdFbHVkR1Z5Ym1WMElGZHBaR2RwZEhNZ1VIUjVJRXgwWklJSkFPbnlDcVdPRXgrbE1Bd0dBMVVkRXdRRgpNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJSk52M3cza0VqSGt5QkNiaURwcFFBczdDU2s1SGJzCisrV0EyZm9sdzZaM3I2SUxHWEpVYmhwaitQZ0V1YTVUTW5ja2VEL0lvMXViYnNqaWZ2eHo1UUJrTDIySHQwdkIKTFJpR1FkMGt2TTFUUkFTUyt2UFk1L096Q2hkUVFPamh0UG5Vc0h2dEVwTHV5SkRlV2QyZTV5cFoveDdmMTZRVApwRG16ajRLNG00YkZPUitSWlQxUkN2SjFDclU1VWR0UzBpWVoyczJmVVJJclQ3Qmo5dDhhdmpReTFxQnNzd1E1CkdFUERTRWVoRC96QzkzMlJsSUw4cGhja05kTHRvZGlMaVlSRU8rTGt6MHdDeWpVTG0vYXVMeWlrNzZ1WlZaR3gKTEJwRUp4WU81bmQvYVViYjNsS3liSXJZYXlkSWJBVk5CcWR1SWxaV3M1cmgwclJFOUZNaDcrbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=",
167
+ "file_name": "cert.pem",
168
+ "file_url": ""
207
169
  },
170
+ "password": "1234",
208
171
  "pfx": {
209
- "file_url": "",
210
- "file_base64": "",
211
- "file_name": ""
172
+ "file_base64": "data:application/x-iwork-keynote-sffkey;base64,LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBNXdvMHFWblAweWY2c2VuYlFSQ0NjY1l0RE5ESU9kenJraURQb0MxYkpjdmNTRUVqCmNCVjRaUC94dkV2V0xjSW9OTTZYa2lrVjYrdjVyeUQ2L1pYTFFJdzVJT1BBanp5VFYybWVST3oxUTE1dkpqTVcKaW5RTXFuajNUcGVwVzdaQ1ZSTkxhU0ZTMmZFUncvWHZFMW0rQWkrRDB5dmZ1RjFCeUEwREJEQmpKbW9CQkVNTQovcmUwVEMzZWFLajliYms3MXdKNGs1M3ZEYjJtaysrUFk2VjE2TW9GcUJJbHRQRzhPbStqWDZWRU5zVDVTUnBMCkpHNTAydnRqSG82RlpDV1FwZFh2UnpXcnI1RHZXZkQ0M1Y5S0lIdCtQRFlucU80M0FtSVFFWkpvN2lJOFc5VEgKVXNEcis5ZVZTcXRLVUtaOTdFNjVHT1k3K2c4L3U3b1VZcm9PNHdJREFRQUJBb0lCQUNXckQwenhIS1lqcFlidQpSdFlEMkJDdXE5ZWtEcEVJaU12SlY3Q1kxSHlFRVVVaWdhR2Jqb2FCQ0N1WC9iSjJMbEgxd05hT3BrbFJydUt6CnNOZzVYT3NJTWFSQUhidjh0MVVRSGtMRWszUkphRHZGSm82cVB3cG9NSUg2emh6cXlVUFBvb0xnY1A2aGhERDcKM3QrN3lQUFlSVmpmbFZrY3MwWG5nUzlrcURXeDBXZStWOGFJMVJCOXVIbUdDcmo4djFZaHFSRWl2dXl4eUVXQwpZSkowVFRqSVhtMC92OVNJRE5FTjJKVExkYmlIdDBvQm9PZk1CWk5MSmhjSWI4cHkvTW5SYW9IN1EvN2VZQllQClNnMzJycXYvZlNjZGhWakltbTNyWEtaclV5NlErcUpNNGp1MCtpV0E4MzRzd2NiaGZhbU5XR2tLcUYzVmo4WEEKendGbkVjRUNnWUVBK056RHpxb3Vlbk9iZE5ORTdFa2FaTDc4TFFlL0VhTkYycHlhS2IvWTFac2F5U2ozSUMxbAp2RCs0V1hQamZJVWl3SldGeEtONGZyVnlldCtZWGhOZ0p3eU9wb2gyZmlaNzExR0paSWRudGFDV3lmRnpGVS8rClZQUm1yUUxIWS9MNHRhdnByTzlhTHBYVWVSYlc0NXVBbUZ5YUtJck1qSkFzMnFpeitKYUxGbUVDZ1lFQTdhcVUKOEE5SHpkVDFsQzB1ZlRoNG1Cdm43enpvSXJHNmY3amhvRVZuazEwWmozKy9pNEFmWEw3VHRuQmtXaTJvZElKbApDb2ZXdGRWbUxvTkhpOER0ZldyWFkzOWhra0ZSSEo5Y01qNEozcEJmaVp0ZUJyaFhucDg1c0xDS0pnWGVNZDNEClhkZVl1TERuczR3Y3FZTnpkbDRQL2cvRGl5RFB5Y29tc3NmdzQ4TUNnWUVBc2pUVWVwOWZIUXpBRzQ1V1lxV08Kb3Vvb2hzNXZRbUFhMjRzYzBoeXhWM1QwWDJ4WVd0Qm5jOEJsY0prT0k5THFxZUhvb29FMC9mZE0vVFEwVmRtbQpGeEJrN2xmMkVpdllycjJTbDB4bk5hYkRrK1MwdG1STUNlWGh5SzZldmJIMTY1SXBpVTcwMHpzenBXcDNneEdOCnFvMVZUd2JscHhwdkpEMStjdHJLeXNFQ2dZRUFyMlo0T3Q4Y0lCVnVGS2h2cWV5Mlc1UWt6UlJIUWV1bTkwSU0KQ2t1T2tGeGlVOXgxRWRCQjFTSGtmNzFjNG96VnlQNis4VkdsTFZkTDdVSG4ySVZQQUlPTWFKc0crSGlLRXpTdApSMHN2MzNqdmVWQVh5Wi9jMG0weWwyc0MyZUwweEJxbFo2bUl4YTJSb3BuaVFWeUpKeTl1WUJOa1BsYTk0Mi8wCnRYY0lHaDhDZ1lCbHJBaVdIOGU4aEhkWjdxTjNOTk51cVkvQjdJWFNPdzFIMEVKbjd3Ui9tZElzalFRYkJGL3gKa05YNndvZDVFeHBzRkVER2lJQ0RiQm1FbW5oaU1TWFBXREhoalZKSkFSUG5sL2Fxc0tNemt0dXdic29DbGQ2OApkT1hkbHNtbGhYZVdrcGp5ZUdCREZ5Y3hPdW80M3F6VzdOOUNpQ285dXBuNGZrSEg3Si95Znc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=",
173
+ "file_name": "client (1).key",
174
+ "file_url": ""
212
175
  },
213
- "HOST": "https://cc.apipost.cc:6003"
176
+ "HOST": "https://apipost.cn:443"
214
177
  }
215
178
  }
216
179
  },
217
- "custom_functions": {
218
- "fn_test04": "\n// 返回函數處理後的text,text為函數的入參 \nreturn text.includes(\"To be\");"
219
- },
180
+ "custom_functions": {},
220
181
  "collection": [
221
182
  {
222
- "target_id": "2d1574ffab006",
183
+ "target_id": "2b835ab23069000",
223
184
  "target_type": "api",
224
- "parent_id": "0",
225
- "name": "post接口",
185
+ "parent_id": "ac6c2b71700a",
186
+ "name": "Anything",
226
187
  "request": {
227
188
  "auth": {
228
189
  "type": "inherit"
229
190
  },
230
- "header": {
231
- "parameter": []
232
- },
233
- "query": {
234
- "query_add_equal": 1,
235
- "parameter": []
236
- },
237
- "restful": {
238
- "parameter": []
239
- },
240
- "cookie": {
241
- "cookie_encode": 1,
242
- "parameter": []
243
- },
244
191
  "body": {
245
- "mode": "form-data",
192
+ "mode": "urlencoded",
246
193
  "parameter": [
247
194
  {
248
- "param_id": "2d54bf27713cb",
249
- "key": "mock",
250
- "value": "{{$mockjs.date()|format(YYYY-MM-DD HH:mm:ss,+08:00)}}",
195
+ "param_id": "a82580771003",
196
+ "description": "",
251
197
  "field_type": "string",
198
+ "is_checked": 1,
199
+ "key": "",
252
200
  "not_null": 1,
253
- "description": "反回时间",
201
+ "value": "",
202
+ "content_type": "",
203
+ "file_name": "",
204
+ "file_base64": "",
205
+ "schema": {
206
+ "type": "string"
207
+ }
208
+ },
209
+ {
210
+ "param_id": "dcc7d2b71005",
211
+ "description": "",
212
+ "field_type": "string",
254
213
  "is_checked": 1,
255
- "content_type": "string"
214
+ "key": "",
215
+ "not_null": 1,
216
+ "value": "",
217
+ "content_type": "",
218
+ "file_name": "",
219
+ "file_base64": "",
220
+ "schema": {
221
+ "type": "string"
222
+ }
256
223
  },
257
224
  {
258
- "param_id": "2d54dd0f713cc",
259
- "key": "mock1",
260
- "value": "{{$fakerjs.Animal.bear}}",
225
+ "param_id": "10bbfac371004",
226
+ "description": "",
261
227
  "field_type": "string",
228
+ "is_checked": 1,
229
+ "key": "",
262
230
  "not_null": 1,
263
- "description": "返回熊类型",
231
+ "value": "",
232
+ "content_type": "",
233
+ "file_name": "",
234
+ "file_base64": "",
235
+ "schema": {
236
+ "type": "string"
237
+ }
238
+ },
239
+ {
240
+ "param_id": "12a8a25771004",
241
+ "description": "",
242
+ "field_type": "string",
243
+ "is_checked": 1,
244
+ "key": "aaaaaaa",
245
+ "not_null": 1,
246
+ "value": "",
247
+ "content_type": "",
248
+ "file_name": "",
249
+ "file_base64": "",
250
+ "schema": {
251
+ "type": "string"
252
+ }
253
+ },
254
+ {
255
+ "param_id": "12adf05771009",
256
+ "description": "",
257
+ "field_type": "string",
258
+ "is_checked": 1,
259
+ "key": "",
260
+ "not_null": 1,
261
+ "value": "",
262
+ "content_type": "",
263
+ "file_name": "",
264
+ "file_base64": "",
265
+ "schema": {
266
+ "type": "string"
267
+ }
268
+ }
269
+ ],
270
+ "raw": "{\n \"id\": 1,\n \"name\": \"\"\n}",
271
+ "raw_parameter": [
272
+ {
273
+ "param_id": "2b835c6eb86902c",
274
+ "description": "用户主键id",
275
+ "field_type": "long",
276
+ "is_checked": 1,
277
+ "key": "id",
278
+ "not_null": 1,
279
+ "value": "1"
280
+ },
281
+ {
282
+ "param_id": "2b835c6eb86902d",
283
+ "description": "用户主键id",
284
+ "field_type": "string",
264
285
  "is_checked": 1,
265
- "content_type": "string"
286
+ "key": "name",
287
+ "not_null": 1,
288
+ "value": "",
289
+ "schema": {
290
+ "type": "string"
291
+ }
266
292
  }
267
293
  ],
268
- "binary": "",
269
- "raw": "{\n \"storeName\": \"SuperMart Online\",\n \"categories\": [\n {\n \"categoryName\": \"Electronics\",\n \"products\": [\n {\n \"productId\": 1,\n \"productName\": \"Smartphone X Pro\",\n \"brand\": \"TechGiant\",\n \"model\": \"X Pro 2025\",\n \"description\": \"The Smartphone X Pro is a high - end device with a 6.7 - inch AMOLED display, 5G connectivity, and a powerful octa - core processor. It comes with 12GB of RAM and 256GB of internal storage. The triple - camera setup on the back provides excellent photography capabilities, and the front - facing camera is great for selfies and video calls.\",\n \"price\": 999.99,\n \"stock\": 50,\n \"reviews\": [\n {\n \"reviewerName\": \"JohnDoe123\",\n \"rating\": 4.5,\n \"comment\": \"This phone is amazing! The display is sharp, and the performance is top - notch. The camera takes great photos, and the battery life is decent.\"\n },\n {\n \"reviewerName\": \"JaneSmith456\",\n \"rating\": 4.0,\n \"comment\": \"Overall, a great phone. However, I found the fingerprint sensor to be a bit slow at times.\"\n }\n ]\n },\n {\n \"productId\": 2,\n \"productName\": \"Laptop ProBook\",\n \"brand\": \"CompuTech\",\n \"model\": \"ProBook 5000\",\n \"description\": \"The Laptop ProBook is a powerful and portable laptop designed for professionals. It features a 15.6 - inch Full HD display, an Intel Core i7 processor, 16GB of RAM, and a 512GB SSD. It also comes with a backlit keyboard and a long - lasting battery, making it ideal for on - the - go work.\",\n \"price\": 1499.99,\n \"stock\": 30,\n \"reviews\": [\n {\n \"reviewerName\": \"TechEnthusiast789\",\n \"rating\": 4.8,\n \"comment\": \"This laptop is a beast! It handles all my work tasks with ease, and the battery life is impressive. The build quality is also very good.\"\n },\n {\n \"reviewerName\": \"OfficeWorker234\",\n \"rating\": 4.2,\n \"comment\": \"I'm very happy with my purchase. The only thing I would like to see improved is the display brightness in direct sunlight.\"\n }\n ]\n }\n ]\n },\n {\n \"categoryName\": \"Clothing\",\n \"products\": [\n {\n \"productId\": 3,\n \"productName\": \"Men's Cotton Shirt\",\n \"brand\": \"FashionFusion\",\n \"model\": \"Classic Fit\",\n \"description\": \"This men's cotton shirt is made from high - quality, breathable cotton. It has a classic fit, a button - down collar, and long sleeves. It comes in a variety of colors and is perfect for both casual and semi - formal occasions.\",\n \"price\": 49.99,\n \"stock\": 100,\n \"reviews\": [\n {\n \"reviewerName\": \"StyleGuy567\",\n \"rating\": 4.0,\n \"comment\": \"The shirt fits well and is comfortable to wear. The color is exactly as shown in the picture.\"\n },\n {\n \"reviewerName\": \"BusinessMan890\",\n \"rating\": 3.5,\n \"comment\": \"The shirt is okay, but I expected the fabric to be a bit thicker.\"\n }\n ]\n },\n {\n \"productId\": 4,\n \"productName\": \"Women's Summer Dress\",\n \"brand\": \"ChicStyles\",\n \"model\": \"Floral Print\",\n \"description\": \"This women's summer dress is a trendy and feminine piece. It features a floral print, a V - neckline, and a flowy skirt. It is made from lightweight and comfortable fabric, making it perfect for warm summer days.\",\n \"price\": 79.99,\n \"stock\": 80,\n \"reviews\": [\n {\n \"reviewerName\": \"Fashionista123\",\n \"rating\": 4.7,\n \"comment\": \"This dress is so cute! I love the floral print and the way it fits. It's my new favorite summer dress.\"\n },\n {\n \"reviewerName\": \"BeachLover456\",\n \"rating\": 4.3,\n \"comment\": \"The dress is very comfortable and looks great on. However, the sizing runs a bit small, so I had to order a size up.\"\n }\n ]\n }\n ]\n },\n {\n \"categoryName\": \"Home Appliances\",\n \"products\": [\n {\n \"productId\": 5,\n \"productName\": \"Refrigerator CoolMaster\",\n \"brand\": \"HomeTech\",\n \"model\": \"CoolMaster 3000\",\n \"description\": \"The Refrigerator CoolMaster is a large - capacity refrigerator with advanced cooling technology. It has a spacious interior, adjustable shelves, and a built - in ice maker. It also features energy - saving mode, making it an environmentally friendly choice.\",\n \"price\": 1999.99,\n \"stock\": 20,\n \"reviews\": [\n {\n \"reviewerName\": \"HomeOwner789\",\n \"rating\": 4.6,\n \"comment\": \"This refrigerator is amazing! It has a lot of space, and the ice maker works great. The energy - saving mode is a plus.\"\n },\n {\n \"reviewerName\": \"KitchenExpert234\",\n \"rating\": 4.1,\n \"comment\": \"The refrigerator is well - built, but the noise level could be a bit lower.\"\n }\n ]\n },\n {\n \"productId\": 6,\n \"productName\": \"Coffee Maker BrewPro\",\n \"brand\": \"KitchenWiz\",\n \"model\": \"BrewPro 200\",\n \"description\": \"The Coffee Maker BrewPro is a programmable coffee maker that can brew up to 12 cups of coffee at a time. It has a built - in grinder, a water filter, and a keep - warm function. It also comes with a user - friendly control panel, making it easy to use.\",\n \"price\": 129.99,\n \"stock\": 60,\n \"reviews\": [\n {\n \"reviewerName\": \"CoffeeAddict567\",\n \"rating\": 4.4,\n \"comment\": \"This coffee maker makes great coffee! The grinder is very efficient, and the keep - warm function works well.\"\n },\n {\n \"reviewerName\": \"BreakfastLover890\",\n \"rating\": 4.0,\n \"comment\": \"The coffee maker is easy to use, but the cleaning process could be a bit simpler.\"\n }\n ]\n }\n ]\n }\n ]\n}",
270
- "raw_parameter": [],
271
294
  "raw_schema": {
272
295
  "type": "object"
273
- }
296
+ },
297
+ "binary": {}
274
298
  },
275
- "pre_tasks": [],
276
- "post_tasks": [
299
+ "pre_tasks": [
277
300
  {
278
- "type": "assert",
279
- "id": "c48d63a3a3006",
280
- "name": "断言1111111",
281
- "enabled": 1,
301
+ "type": "database",
302
+ "enabled": -1,
282
303
  "data": {
283
- "type": "responseTime",
284
- "expression": {
285
- "compareType": "lt",
286
- "compareValue": "30",
287
- "path": "1"
304
+ "connectionId": "2b9e0de71864000",
305
+ "isConsoleOutput": 1,
306
+ "query": "select * from user limit 0,2",
307
+ "variables": []
308
+ },
309
+ "name": "数据库",
310
+ "id": "3d59fd65bd6066"
311
+ }
312
+ ],
313
+ "post_tasks": [
314
+ {
315
+ "type": "customScript",
316
+ "enabled": -1,
317
+ "data": "pm.environment.set(\"code\", 201);\napt.test(\"成功的POST请求\", function () {\n apt.expect(apt.response.code).to.be.oneOf([201, 202]);\n});\npm.environment.set(\"code\", 201);\napt.test(\"成功的POST请求\", function () {\n apt.expect(apt.response.code).to.be.oneOf([201, 202]);\n});\n\napt.test(\"响应时间小于 200ms\", function () {\n apt.expect(apt.response.responseTime).to.be.below(200);\n });\napt.test(\"存在响应头 Content-Type\", function () {\n apt.response.to.have.header(\"Content-Type\");\n });\napt.test(\"状态码包含字符串\", function () {\n apt.response.to.have.status(\"Created\");\n });\nvar jsonObject = xml2Json(responseBody);\nvar schema = {\n \"items\": {\n \"type\": \"boolean\"\n }\n };\n\n var data1 = [true, false];\n var data2 = [true, 123];\n\n apt.test('Schema is valid', function () {\n apt.expect(tv4.validate(data1, schema)).to.be.true;\n apt.expect(tv4.validate(data2, schema)).to.be.true;\n });",
318
+ "name": "自定义脚本",
319
+ "id": "3d53b40ffd6022"
320
+ }
321
+ ],
322
+ "header": {
323
+ "parameter": []
324
+ },
325
+ "query": {
326
+ "query_add_equal": 1,
327
+ "parameter": [
328
+ {
329
+ "param_id": "cfaaea831700d",
330
+ "description": "",
331
+ "field_type": "string",
332
+ "is_checked": 1,
333
+ "key": "code",
334
+ "not_null": 1,
335
+ "value": "{{code}}",
336
+ "schema": {
337
+ "type": "string"
288
338
  }
289
339
  }
290
- }
291
- ]
340
+ ]
341
+ },
342
+ "cookie": {
343
+ "cookie_encode": 1,
344
+ "parameter": []
345
+ },
346
+ "restful": {
347
+ "parameter": []
348
+ }
292
349
  },
293
- "parents": [],
350
+ "parents": [
351
+ {
352
+ "target_id": "ac6c2b71700a",
353
+ "target_type": "folder"
354
+ }
355
+ ],
294
356
  "method": "POST",
295
357
  "protocol": "http/1.1",
296
- "url": "go.apipost.cn",
358
+ "url": "https://go.apipost.cn?code={{code}}",
359
+ "pre_url": ""
360
+ },
361
+ {
362
+ "target_id": "ac6c2b71700a",
363
+ "target_type": "folder",
364
+ "parent_id": "0",
365
+ "name": "未命名目录",
366
+ "request": {
367
+ "auth": {
368
+ "type": "inherit"
369
+ },
370
+ "pre_tasks": [],
371
+ "post_tasks": [],
372
+ "body": {
373
+ "parameter": []
374
+ },
375
+ "header": {
376
+ "parameter": []
377
+ },
378
+ "query": {
379
+ "parameter": []
380
+ },
381
+ "cookie": {
382
+ "parameter": []
383
+ }
384
+ },
385
+ "parents": [],
386
+ "server_id": "0",
297
387
  "pre_url": ""
298
388
  }
299
389
  ],
300
390
  "database_configs": {},
301
- "name": "【勿动】自动化测试循环——满足条件跳出循环,一直不执行",
391
+ "name": "if",
302
392
  "ignore_error": -1,
303
393
  "enable_sandbox": -1,
304
- "iterationCount": 1,
394
+ "iterationCount": 2,
305
395
  "sleep": 0,
306
- "testing_id": "640959ffab519",
307
- "iterates_data_id": "0",
308
- "iterationData": []
396
+ "testing_id": "d1bfa1f7d603c",
397
+ "iterates_data_id": "d1fdbdfbd60ac",
398
+ "iterationData": [
399
+ {
400
+ "code": "201",
401
+ "name": "name201"
402
+ },
403
+ {
404
+ "code": "202",
405
+ "name": "name202"
406
+ },
407
+ {
408
+ "code": "203",
409
+ "name": "name203"
410
+ },
411
+ {
412
+ "name": "name204",
413
+ "code": "204"
414
+ },
415
+ {
416
+ "code": "205",
417
+ "name": "name205"
418
+ },
419
+ {
420
+ "code": "206",
421
+ "name": "name206"
422
+ }
423
+ ]
309
424
  },
310
425
  "test_events": [
311
426
  {
427
+ "parent_event_id": "0",
428
+ "enabled": 1,
429
+ "type": "if",
312
430
  "data": {
313
- "name": "满足条件退出循环",
314
- "sleep": 0,
315
- "loop_type": 3,
316
- "loop_timeout": 0,
317
- "loop_condition": {
318
- "var": "1",
319
- "value": "1",
320
- "compare": "uneq"
321
- },
322
- "loop_traverse_data": {
323
- "name": "",
324
- "type": 1,
325
- "iterationData": []
326
- }
431
+ "var": "1",
432
+ "compare": "eq",
433
+ "value": "1"
327
434
  },
435
+ "project_id": "2adc267c9064000",
436
+ "test_id": "d1bfa1f7d603c",
437
+ "event_id": "d1c5f603d606d",
328
438
  "sort": 1,
329
- "type": "loop",
330
- "enabled": 1,
331
- "test_id": "640959ffab519",
332
- "event_id": "640e4777ab51b",
333
- "project_id": "1a89866533408002",
334
- "parent_event_id": "0",
335
439
  "children": [
336
440
  {
337
441
  "type": "api",
338
- "auto_sync": false,
339
- "test_id": "640959ffab519",
340
- "event_id": "640e9153ab51d",
442
+ "auto_sync": true,
443
+ "test_id": "d1bfa1f7d603c",
444
+ "event_id": "d1c6a65bd6072",
341
445
  "enabled": 1,
342
446
  "data": {
343
- "target_id": "2d1574ffab006",
344
- "project_id": "1a89866533408002",
345
- "parent_id": "0",
346
- "target_type": "api",
347
- "apiData": {
348
- "name": "post接口",
349
- "method": "POST",
350
- "protocol": "http/1.1",
351
- "url": "{{url}}",
352
- "request": {
353
- "auth": {
354
- "type": "inherit"
355
- },
356
- "body": {
357
- "raw": "{\n \"storeName\": \"SuperMart Online\",\n \"categories\": [\n {\n \"categoryName\": \"Electronics\",\n \"products\": [\n {\n \"productId\": 1,\n \"productName\": \"Smartphone X Pro\",\n \"brand\": \"TechGiant\",\n \"model\": \"X Pro 2025\",\n \"description\": \"The Smartphone X Pro is a high - end device with a 6.7 - inch AMOLED display, 5G connectivity, and a powerful octa - core processor. It comes with 12GB of RAM and 256GB of internal storage. The triple - camera setup on the back provides excellent photography capabilities, and the front - facing camera is great for selfies and video calls.\",\n \"price\": 999.99,\n \"stock\": 50,\n \"reviews\": [\n {\n \"reviewerName\": \"JohnDoe123\",\n \"rating\": 4.5,\n \"comment\": \"This phone is amazing! The display is sharp, and the performance is top - notch. The camera takes great photos, and the battery life is decent.\"\n },\n {\n \"reviewerName\": \"JaneSmith456\",\n \"rating\": 4.0,\n \"comment\": \"Overall, a great phone. However, I found the fingerprint sensor to be a bit slow at times.\"\n }\n ]\n },\n {\n \"productId\": 2,\n \"productName\": \"Laptop ProBook\",\n \"brand\": \"CompuTech\",\n \"model\": \"ProBook 5000\",\n \"description\": \"The Laptop ProBook is a powerful and portable laptop designed for professionals. It features a 15.6 - inch Full HD display, an Intel Core i7 processor, 16GB of RAM, and a 512GB SSD. It also comes with a backlit keyboard and a long - lasting battery, making it ideal for on - the - go work.\",\n \"price\": 1499.99,\n \"stock\": 30,\n \"reviews\": [\n {\n \"reviewerName\": \"TechEnthusiast789\",\n \"rating\": 4.8,\n \"comment\": \"This laptop is a beast! It handles all my work tasks with ease, and the battery life is impressive. The build quality is also very good.\"\n },\n {\n \"reviewerName\": \"OfficeWorker234\",\n \"rating\": 4.2,\n \"comment\": \"I'm very happy with my purchase. The only thing I would like to see improved is the display brightness in direct sunlight.\"\n }\n ]\n }\n ]\n },\n {\n \"categoryName\": \"Clothing\",\n \"products\": [\n {\n \"productId\": 3,\n \"productName\": \"Men's Cotton Shirt\",\n \"brand\": \"FashionFusion\",\n \"model\": \"Classic Fit\",\n \"description\": \"This men's cotton shirt is made from high - quality, breathable cotton. It has a classic fit, a button - down collar, and long sleeves. It comes in a variety of colors and is perfect for both casual and semi - formal occasions.\",\n \"price\": 49.99,\n \"stock\": 100,\n \"reviews\": [\n {\n \"reviewerName\": \"StyleGuy567\",\n \"rating\": 4.0,\n \"comment\": \"The shirt fits well and is comfortable to wear. The color is exactly as shown in the picture.\"\n },\n {\n \"reviewerName\": \"BusinessMan890\",\n \"rating\": 3.5,\n \"comment\": \"The shirt is okay, but I expected the fabric to be a bit thicker.\"\n }\n ]\n },\n {\n \"productId\": 4,\n \"productName\": \"Women's Summer Dress\",\n \"brand\": \"ChicStyles\",\n \"model\": \"Floral Print\",\n \"description\": \"This women's summer dress is a trendy and feminine piece. It features a floral print, a V - neckline, and a flowy skirt. It is made from lightweight and comfortable fabric, making it perfect for warm summer days.\",\n \"price\": 79.99,\n \"stock\": 80,\n \"reviews\": [\n {\n \"reviewerName\": \"Fashionista123\",\n \"rating\": 4.7,\n \"comment\": \"This dress is so cute! I love the floral print and the way it fits. It's my new favorite summer dress.\"\n },\n {\n \"reviewerName\": \"BeachLover456\",\n \"rating\": 4.3,\n \"comment\": \"The dress is very comfortable and looks great on. However, the sizing runs a bit small, so I had to order a size up.\"\n }\n ]\n }\n ]\n },\n {\n \"categoryName\": \"Home Appliances\",\n \"products\": [\n {\n \"productId\": 5,\n \"productName\": \"Refrigerator CoolMaster\",\n \"brand\": \"HomeTech\",\n \"model\": \"CoolMaster 3000\",\n \"description\": \"The Refrigerator CoolMaster is a large - capacity refrigerator with advanced cooling technology. It has a spacious interior, adjustable shelves, and a built - in ice maker. It also features energy - saving mode, making it an environmentally friendly choice.\",\n \"price\": 1999.99,\n \"stock\": 20,\n \"reviews\": [\n {\n \"reviewerName\": \"HomeOwner789\",\n \"rating\": 4.6,\n \"comment\": \"This refrigerator is amazing! It has a lot of space, and the ice maker works great. The energy - saving mode is a plus.\"\n },\n {\n \"reviewerName\": \"KitchenExpert234\",\n \"rating\": 4.1,\n \"comment\": \"The refrigerator is well - built, but the noise level could be a bit lower.\"\n }\n ]\n },\n {\n \"productId\": 6,\n \"productName\": \"Coffee Maker BrewPro\",\n \"brand\": \"KitchenWiz\",\n \"model\": \"BrewPro 200\",\n \"description\": \"The Coffee Maker BrewPro is a programmable coffee maker that can brew up to 12 cups of coffee at a time. It has a built - in grinder, a water filter, and a keep - warm function. It also comes with a user - friendly control panel, making it easy to use.\",\n \"price\": 129.99,\n \"stock\": 60,\n \"reviews\": [\n {\n \"reviewerName\": \"CoffeeAddict567\",\n \"rating\": 4.4,\n \"comment\": \"This coffee maker makes great coffee! The grinder is very efficient, and the keep - warm function works well.\"\n },\n {\n \"reviewerName\": \"BreakfastLover890\",\n \"rating\": 4.0,\n \"comment\": \"The coffee maker is easy to use, but the cleaning process could be a bit simpler.\"\n }\n ]\n }\n ]\n }\n ]\n}",
358
- "mode": "form-data",
359
- "binary": "",
360
- "parameter": [
361
- {
362
- "key": "mock",
363
- "value": "{{$mockjs.date()|format(YYYY-MM-DD HH:mm:ss,+08:00)}}",
364
- "not_null": 1,
365
- "param_id": "2d54bf27713cb",
366
- "field_type": "string",
367
- "is_checked": 1,
368
- "description": "反回时间",
369
- "content_type": "string"
370
- },
371
- {
372
- "key": "mock1",
373
- "value": "{{$fakerjs.Animal.bear}}",
374
- "not_null": 1,
375
- "param_id": "2d54dd0f713cc",
376
- "field_type": "string",
377
- "is_checked": 1,
378
- "description": "返回熊类型",
379
- "content_type": "string"
380
- }
381
- ],
382
- "raw_schema": {
383
- "type": "object"
384
- },
385
- "raw_parameter": []
386
- },
387
- "query": {
388
- "parameter": [],
389
- "query_add_equal": 1
390
- },
391
- "cookie": {
392
- "parameter": [],
393
- "cookie_encode": 1
394
- },
395
- "header": {
396
- "parameter": []
397
- },
398
- "restful": {
399
- "parameter": []
400
- },
401
- "pre_tasks": [],
402
- "post_tasks": []
403
- }
404
- }
447
+ "target_id": "2b835ab23069000",
448
+ "project_id": "2adc267c9064000",
449
+ "parent_id": "ac6c2b71700a",
450
+ "target_type": "api"
405
451
  }
452
+ },
453
+ {
454
+ "parent_event_id": "d1c5f603d606d",
455
+ "enabled": 1,
456
+ "type": "script",
457
+ "data": {
458
+ "name": "脚本",
459
+ "content": "pm.variables.set(\"code\",400)"
460
+ },
461
+ "project_id": "2adc267c9064000",
462
+ "test_id": "d1bfa1f7d603c",
463
+ "event_id": "d1c77c1fd6077",
464
+ "sort": 3
406
465
  }
407
466
  ]
408
467
  }