debug-apifox-response.js
3.61 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env node
/**
* Apifox API 响应调试工具
*
* 功能:输出完整的 API 响应,帮助诊断问题
*/
const fs = require('fs');
const path = require('path');
const https = require('https');
// 加载配置
function loadConfig() {
const envPath = path.join(__dirname, '../.env.apifox');
const env = fs.readFileSync(envPath, 'utf-8');
const config = {};
env.split('\n').forEach(line => {
const [key, ...valueParts] = line.split('=');
const value = valueParts.join('=');
if (key && !key.startsWith('#') && value) {
config[key.trim()] = value.trim();
}
});
return config;
}
// 发送 HTTPS 请求
function httpsRequest(options) {
return new Promise((resolve, reject) => {
console.log(`📡 请求 URL: https://${options.hostname}${options.path}`);
console.log(`📋 请求头:`, JSON.stringify(options.headers, null, 2));
const req = https.request(options, (res) => {
console.log(`\n📊 响应状态码: ${res.statusCode}`);
console.log(`📋 响应头:`, JSON.stringify(res.headers, null, 2));
const chunks = [];
res.on('data', chunk => {
chunks.push(chunk);
});
res.on('end', () => {
const raw = Buffer.concat(chunks).toString('utf8').trim();
if (!raw) {
console.log('⚠️ 响应体为空');
resolve({ raw: null, statusCode: res.statusCode });
return;
}
console.log(`\n📦 响应体长度: ${raw.length} 字符`);
console.log(`📄 响应体内容:`);
console.log('---开始---');
console.log(raw);
console.log('---结束---\n');
try {
const json = JSON.parse(raw.replace(/^\uFEFF/, ''));
resolve(json);
} catch (err) {
console.error(`❌ JSON 解析失败: ${err.message}`);
resolve({ raw, parseError: err.message });
}
});
});
req.on('error', (err) => {
console.error(`❌ 请求失败: ${err.message}`);
reject(err);
});
req.end();
});
}
// 主函数
async function main() {
console.log('🔍 Apifox API 响应调试工具\n');
const config = loadConfig();
// 测试获取接口列表
console.log('========================================');
console.log('测试: 获取接口列表');
console.log('========================================\n');
const options = {
hostname: 'api.apifox.com',
path: `/api/v1/projects/${config.VITE_APIFOX_PROJECT_ID}/apis?pageSize=10`,
method: 'GET',
headers: {
'Authorization': `Bearer ${config.VITE_APIFOX_TOKEN}`,
'Content-Type': 'application/json'
}
};
try {
const response = await httpsRequest(options);
console.log('========================================');
console.log('解析结果');
console.log('========================================\n');
if (response.parseError) {
console.log(`❌ 无法解析 JSON`);
console.log(`原始响应:`, response.raw);
} else {
console.log(`✅ JSON 解析成功`);
console.log(`响应类型: ${typeof response}`);
console.log(`响应键:`, Object.keys(response));
console.log(`\ndata 类型: ${typeof response.data}`);
console.log(`data 是数组: ${Array.isArray(response.data)}`);
console.log(`data 长度: ${response.data?.length || 0}`);
console.log(`total: ${response.total}`);
if (response.data && response.data.length > 0) {
console.log(`\n第一个接口示例:`);
console.log(JSON.stringify(response.data[0], null, 2));
}
}
} catch (err) {
console.error(`\n❌ 请求失败: ${err.message}`);
}
}
main();