FUXA Web API 测试文档 [20260212]
概述
本文档记录了 FUXA 服务器的 Web API 测试结果,使用 API Key 进行认证。
服务器地址: http://127.0.0.1:1881
API Key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ
API 版本: 1.0.0
认证方式
API Key 认证
在请求头中添加 x-api-key:
curl -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ" http://127.0.0.1:1881/api/endpoint
JWT Token 认证
在请求头中添加 x-access-token:
curl -H "x-access-token: YOUR_JWT_TOKEN" http://127.0.0.1:1881/api/endpoint
API 测试结果
1. 系统相关 API
1.1 获取 API 版本
端点: GET /api/version
请求:
curl -X GET "http://127.0.0.1:1881/api/version" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
"1.0.0"
状态: ✅ 成功
1.2 获取服务器设置
端点: GET /api/settings
请求:
curl -X GET "http://127.0.0.1:1881/api/settings" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
{
"version":1.4,
"language":"zh-cn",
"uiPort":1881,
"logDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_logs",
"logApiLevel":"tiny",
"dbDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_db",
"daqEnabled":true,
"daqTokenizer":24,
"logs":{
"retention":"year1"
},
"broadcastAll":false,
"allowedOrigins":[
"http://localhost",
"http://127.0.0.1",
"http://192.168.*",
"http://10.*",
"http://localhost:4200"
],
"heartbeatIntervalSec":10,
"webcamSnapShotsDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_webcam_snapshots",
"webcamSnapShotsCleanup":false,
"webcamSnapShotsRetain":7,
"swaggerEnabled":true,
"nodeRedEnabled":true,
"appName":"FUXA",
"workDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_appdata",
"appDir":"D:\\FUXA\\PROv1.2.11-2666\\server",
"packageDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_pkg",
"settingsFile":"D:\\FUXA\\PROv1.2.11-2666\\server\\_appdata\\settings.js",
"environment":"prod",
"uploadFileDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_appdata\\_upload_files",
"imagesFileDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_images",
"widgetsFileDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_widgets",
"reportsDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_reports",
"resourcesFileDir":"D:\\FUXA\\PROv1.2.11-2666\\server\\_resources",
"logFileName":"fuxa-log",
"serverName":"FUXA Server",
"reportHeaderText":"Report created from FUXA",
"userSettingsFile":"D:\\FUXA\\PROv1.2.11-2666\\server\\_appdata\\mysettings.json",
"secureEnabled":false,
"tokenExpiresIn":"1h",
"smtp":{
"host":"",
"port":587,
"mailsender":"",
"username":"",
"subject":""
},
"daqstore":{
"type":"SQlite",
"retention":"year1"
},
"alarms":{
"retention":"year1"
},
"logFull":false,
"nodeRedAuthMode":"legacy-open",
"httpUploadFileStatic":"resources",
"httpStatic":"D:\\FUXA\\PROv1.2.11-2666\\client\\dist",
"uiHost":"0.0.0.0",
"serverPort":1881
}
状态: ✅ 成功
2. 项目相关 API
2.1 获取项目信息
端点: GET /api/project
请求:
curl -X GET "http://127.0.0.1:1881/api/project" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
{
"devices":[],
"tags":[],
"alarms":[],
"views":[],
"layout":{
"autoresize":false,
"start":"v_0712346b1-12b1210",
"navigation":{
"mode":"over",
"type":"block",
"bkcolor":"#F4F5F7",
"fgcolor":"#1D1D1D",
"items":[],
"logo":false
},
"header":{
"bkcolor":"#ffffff",
"fgcolor":"#000000",
"fontSize":13,
"itemsAnchor":"left"
},
"showdev":true,
"inputdialog":"false",
"hidenavigation":false,
"theme":"",
"loginonstart":false,
"loginoverlaycolor":"none",
"show_connection_error":true,
"customStyles":""
},
"version":"1.00",
"projectFile":"C:\\Users\\Meimetis\\AppData\\Roaming\\.fuxa\\project.json",
"charts":[
{
"id":"0a254398-513213",
"name":"My chart",
"lines":[
{
"id":"Tag Byte",
"name":"Tag Byte",
"device":"Device A",
"color":"#4484ef",
"label":"Tag Byte",
"yaxis":1
}
]
}
],
"viewTree":[],
"viewtree":[],
"server":{
"id":"0",
"name":"FuxaServer",
"type":"FuxaServer",
"property":{
"address":"0.0.0.0"
}
}
}
状态: ✅ 成功
2.2 获取演示项目
端点: GET /api/projectdemo
请求:
curl -X GET "http://127.0.0.1:1881/api/projectdemo" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="utf-8">
<title>Error</title>
</head>
<body>
<pre>SyntaxError: Unexpected token '', "{"devices"... is not valid JSON<br>
</pre>
</body>
</html>
状态: ❌ 失败 – JSON 解析错误
3. 用户管理 API
3.1 获取用户列表
端点: GET /api/users
请求:
curl -X GET "http://127.0.0.1:1881/api/users" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[
{
"username":"admin",
"fullname":"Administrator Account",
"password":"$2a$10$nWAdb1o5o1o.HuKWGlnP2.Y8KcI/HT1uWoyqDuCun0gm0bixx1Gye",
"groups":-1,
"info":null
}
]
状态: ✅ 成功
3.2 获取角色列表
端点: GET /api/roles
请求:
curl -X GET "http://127.0.0.1:1881/api/roles" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[]
状态: ✅ 成功(无角色数据)
4. 报警管理 API
4.1 获取当前报警
端点: GET /api/alarms
请求:
curl -X GET "http://127.0.0.1:1881/api/alarms" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[]
状态: ✅ 成功(无报警)
4.2 获取报警历史
端点: GET /api/alarmsHistory
请求:
curl -X GET "http://127.0.0.1:1881/api/alarmsHistory" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[]
状态: ✅ 成功(无历史记录)
5. 插件管理 API
5.1 获取插件列表
端点: GET /api/plugins
请求:
curl -X GET "http://127.0.0.1:1881/api/plugins" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[
{
"name":"node-opcua",
"module":"./opcua",
"type":"OPCUA",
"version":"2.78.0",
"current":"2.149.0",
"pkg":false,
"group":"connection-device"
},
{
"name":"modbus-serial",
"module":"./modbus",
"type":"Modbus",
"version":"8.0.9",
"current":"8.0.19",
"pkg":false,
"group":"connection-device"
},
{
"name":"node-bacnet",
"module":"./bacnet",
"type":"BACnet",
"version":"0.2.4",
"current":"0.2.4",
"pkg":false,
"group":"connection-device"
},
{
"name":"node-snap7",
"module":"./s7",
"type":"SiemensS7",
"version":"1.0.7",
"current":"1.0.7",
"pkg":false,
"group":"connection-device"
},
{
"name":"ads-client",
"module":"./ads-client",
"type":"ADSclient",
"version":"2.1.0",
"current":"2.1.0",
"pkg":false,
"group":"connection-device"
},
{
"name":"nodepccc",
"module":"./ethernetip",
"type":"EthernetIP",
"version":"0.1.17",
"current":"0.1.17",
"pkg":true,
"group":"connection-device",
"dinamic":true
},
{
"name":"odbc",
"module":"./odbc",
"type":"ODBC",
"version":"2.4.8",
"current":"2.4.9",
"pkg":false,
"group":"connection-database"
},
{
"name":"chart.js",
"module":"./chartjs",
"type":"Chart",
"version":"2.9.4",
"current":"",
"pkg":false,
"group":"chart-report"
},
{
"name":"chartjs-node-canvas",
"module":"chartjs-canvas",
"type":"Chart",
"version":"3.2.0",
"current":"",
"pkg":false,
"group":"chart-report"
},
{
"name":"onoff",
"module":"./onoff",
"type":"GPIO",
"version":"6.0.3",
"current":"",
"pkg":false,
"group":"connection-device"
},
{
"name":"node-webcam",
"module":"./node-webcam",
"type":"WebCam",
"version":"0.8.2",
"current":"0.8.2",
"pkg":true,
"group":"connection-device",
"dinamic":true
},
{
"name":"mcprotocol",
"module":"./mcprotocol",
"type":"MELSEC",
"version":"0.1.2",
"current":"0.1.2",
"pkg":true,
"group":"connection-device",
"dinamic":true
},
{
"name":"node-red",
"module":"./node-red",
"type":"node-red",
"version":"4.1.0",
"current":"4.1.5",
"pkg":false,
"group":"service"
},
{
"name":"redis",
"module":"./redis",
"type":"REDIS",
"version":"5.8.2",
"current":"5.8.2",
"pkg":true,
"group":"connection-device",
"dinamic":true
}
]
状态: ✅ 成功
6. 资源管理 API
6.1 获取图片资源
端点: GET /api/resources/images
请求:
curl -X GET "http://127.0.0.1:1881/api/resources/images" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
{
"groups":[
{
"name":"Agriculture",
"items":[
{"path":"_images/Agriculture/barn.svg","name":"barn.svg"},
{"path":"_images/Agriculture/corn.svg","name":"corn.svg"},
{"path":"_images/Agriculture/crateoffruit.svg","name":"crateoffruit.svg"},
{"path":"_images/Agriculture/farmscene.svg","name":"farmscene.svg"},
{"path":"_images/Agriculture/irrigators.svg","name":"irrigators.svg"},
{"path":"_images/Agriculture/rice.svg","name":"rice.svg"},
{"path":"_images/Agriculture/silo.svg","name":"silo.svg"},
{"path":"_images/Agriculture/tractor.svg","name":"tractor.svg"},
{"path":"_images/Agriculture/wheat.svg","name":"wheat.svg"},
{"path":"_images/Agriculture/wheat2.svg","name":"wheat2.svg"}
]
},
{
"name":"Valve",
"items":[
{"path":"_images/Valve/checkvalve_closed.svg","name":"checkvalve_closed.svg"},
{"path":"_images/Valve/checkvalve_open.svg","name":"checkvalve_open.svg"},
{"path":"_images/Valve/solenoidvalve.svg","name":"solenoidvalve.svg"},
{"path":"_images/Valve/valve.svg","name":"valve.svg"},
{"path":"_images/Valve/valvesymbol.svg","name":"valvesymbol.svg"},
{"path":"_images/Valve/valve_1path_left.svg","name":"valve_1path_left.svg"},
{"path":"_images/Valve/valve_2.svg","name":"valve_2.svg"},
{"path":"_images/Valve/valve_3d_3way1.svg","name":"valve_3d_3way1.svg"}
]
}
]
}
状态: ✅ 成功
6.2 获取模板列表
端点: GET /api/resources/templates
请求:
curl -X GET "http://127.0.0.1:1881/api/resources/templates" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[
{
"name":"mdbus",
"type":"device",
"content":"{\"id\":\"d_d2ac34d8-b9794a15\",\"name\":\"mdbus\",\"enabled\":true,\"property\":{\"address\":\"COM10\",\"port\":null,\"slot\":null,\"rack\":null,\"slaveid\":\"1\",\"baudrate\":9600,\"databits\":8,\"stopbits\":1,\"parity\":\"None\",\"connectionOption\":\"SerialPort\",\"delay\":10,\"socketReuse\":null,\"forceFC16\":false},\"type\":\"ModbusRTU\",\"polling\":700,\"tags\":{}}"
}
]
状态: ✅ 成功
6.3 获取组件列表
端点: GET /api/resources/widgets
请求:
curl -X GET "http://127.0.0.1:1881/api/resources/widgets" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
{
"groups":[
{
"name":"Basic",
"items":[
{"path":"_widgets/Basic/20_Cone.svg","name":"20_Cone.svg"}
]
},
{
"name":"Control-Gauges",
"items":[]
},
{
"name":"Tanks",
"items":[
{"path":"_widgets/Tanks/circularTankLevel-v1.svg","name":"circularTankLevel-v1.svg"},
{"path":"_widgets/Tanks/squareTankLevel-v1.svg","name":"squareTankLevel-v1.svg"}
]
}
]
}
状态: ✅ 成功
7. API Key 管理 API
7.1 获取 API Key 列表
端点: GET /api/apikeys
请求:
curl -X GET "http://127.0.0.1:1881/api/apikeys" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[
{
"id":"ak_451a4497-10783",
"name":"test",
"key":"awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ",
"description":"",
"created":"2026-02-12T00:00:00.000Z",
"expires":"2027-02-12T00:00:00.000Z",
"enabled":true
}
]
状态: ✅ 成功
8. 诊断 API
8.1 获取日志文件列表
端点: GET /api/logsdir
请求:
curl -X GET "http://127.0.0.1:1881/api/logsdir" -H "x-api-key: awnNx4VWqdh9AFBe3C58OaUUVqwIDS0F2RMBsELQ"
响应:
[
"api.log",
"fuxa-log-err.log",
"fuxa-log.log",
"tcscada-log-err.log",
"tcscada-log.log"
]
状态: ✅ 成功
测试总结
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
成功率: 13/14 (92.9%)
支持的设备插件
根据插件列表,FUXA 支持以下设备连接:
- OPCUA
– OPC UA 通信 - Modbus
– Modbus RTU/TCP 通信 - BACnet
– BACnet 协议 - SiemensS7
– 西门子 S7 协议 - ADSclient
– Beckhoff ADS 协议 - EthernetIP
– Allen-Bradley Ethernet/IP - ODBC
– ODBC 数据库连接 - GPIO
– Raspberry Pi GPIO - WebCam
– 网络摄像头 - MELSEC
– 三菱 MELSEC 协议 - REDIS
– Redis 数据库 - node-red
– Node-RED 集成
注意事项
- API Key 有效期
: 测试使用的 API Key 有效期至 2027-02-12 - 认证方式
: 支持 API Key 和 JWT Token 两种认证方式 - 错误处理
: 失败的 API 返回 HTML 格式的错误信息 - 数据格式
: 所有成功的 API 响应均为 JSON 格式 - 安全设置
: 当前 secureEnabled: false,生产环境建议启用认证 - Swagger 文档
: 可通过 http://127.0.0.1:1881/api-docs访问交互式 API 文档
常见问题
Q: 如何获取新的 API Key?
A: 需要通过 FUXA Web 界面的用户管理功能创建新的 API Key。
Q: API Key 失效后如何处理?
A: 需要联系管理员重新生成或更新 API Key。
Q: 如何处理 JSON 解析错误?
A: 检查请求参数格式是否正确,确保 JSON 格式符合规范。
Q: 支持哪些 HTTP 方法?
A: 主要支持 GET、POST、DELETE 方法,具体取决于 API 端点。
更新记录
- 2026-02-12
: 初始版本,完成主要 API 端点测试
技术支持
夜雨聆风
