301 lines
8.0 KiB
Markdown
301 lines
8.0 KiB
Markdown
|
# VWED WebSocket接口文档
|
|||
|
|
|||
|
本文档描述了VWED系统WebSocket相关的API接口,主要用于实时推送任务执行结果和状态更新。
|
|||
|
|
|||
|
## 基础信息
|
|||
|
|
|||
|
- 基础路径:`/ws`
|
|||
|
- 接口标签:`WebSocket`
|
|||
|
- 协议:WebSocket协议(ws://或wss://)
|
|||
|
|
|||
|
## 接口清单
|
|||
|
|
|||
|
| 序号 | 接口名称 | 接口路径 | 协议 | 接口描述 |
|
|||
|
| --- | --- | --- | --- | --- |
|
|||
|
| 1 | 任务执行结果实时推送 | `/task-execution/{task_record_id}` | WebSocket | 实时推送指定任务记录的执行结果更新 |
|
|||
|
| 2 | 任务执行结果广播 | `/task-execution-broadcast/{task_record_id}` | WebSocket | 接收任务执行结果广播消息 |
|
|||
|
|
|||
|
## 接口详情
|
|||
|
|
|||
|
### 1. 任务执行结果实时推送
|
|||
|
|
|||
|
#### 接口说明
|
|||
|
|
|||
|
建立WebSocket连接,实时接收指定任务记录的执行结果更新。服务器会定期推送任务状态变化,客户端也可以主动请求获取当前状态。
|
|||
|
|
|||
|
#### 连接路径
|
|||
|
|
|||
|
```
|
|||
|
ws://your-domain/ws/task-execution/{task_record_id}?interval={interval}
|
|||
|
```
|
|||
|
|
|||
|
#### 路径参数
|
|||
|
|
|||
|
| 参数名 | 类型 | 是否必须 | 描述 |
|
|||
|
| --- | --- | --- | --- |
|
|||
|
| task_record_id | string | 是 | 任务记录ID |
|
|||
|
|
|||
|
#### 查询参数
|
|||
|
|
|||
|
| 参数名 | 类型 | 是否必须 | 默认值 | 描述 |
|
|||
|
| --- | --- | --- | --- | --- |
|
|||
|
| interval | integer | 否 | 2 | 推送间隔(秒),范围1-30秒 |
|
|||
|
|
|||
|
#### 客户端消息格式
|
|||
|
|
|||
|
客户端可以向服务器发送以下格式的JSON消息:
|
|||
|
|
|||
|
##### 心跳检测
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "ping",
|
|||
|
"timestamp": "2025-06-11T12:00:00.000Z"
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
##### 获取当前状态
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "get_status",
|
|||
|
"timestamp": "2025-06-11T12:00:00.000Z"
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
#### 服务器消息格式
|
|||
|
|
|||
|
##### 任务执行结果更新
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "task_execution_update",
|
|||
|
"task_record_id": "任务记录ID",
|
|||
|
"timestamp": "2025-06-11T12:00:00.000Z",
|
|||
|
"message": "成功获取任务记录执行结果",
|
|||
|
"data": [
|
|||
|
{
|
|||
|
"created_at": "2025-06-11T12:00:00.000Z",
|
|||
|
"context": "[块执行名称] 执行内容描述",
|
|||
|
"status": "SUCCESS/FAILED/RUNNING"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
##### 心跳响应
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "pong",
|
|||
|
"timestamp": "2025-06-11T12:00:00.000Z"
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
##### 错误消息
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "error",
|
|||
|
"task_record_id": "任务记录ID",
|
|||
|
"timestamp": "2025-06-11T12:00:00.000Z",
|
|||
|
"message": "错误描述信息"
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
#### 响应字段说明
|
|||
|
|
|||
|
##### 任务执行结果字段
|
|||
|
|
|||
|
| 字段名 | 类型 | 描述 |
|
|||
|
| --- | --- | --- |
|
|||
|
| type | string | 消息类型,固定为"task_execution_update" |
|
|||
|
| task_record_id | string | 任务记录ID |
|
|||
|
| timestamp | string | 消息时间戳,ISO 8601格式 |
|
|||
|
| message | string | 响应消息描述 |
|
|||
|
| data | array | 执行结果数组 |
|
|||
|
| data[].created_at | string | 结果创建时间,ISO 8601格式 |
|
|||
|
| data[].context | string | 执行内容描述 |
|
|||
|
| data[].status | string | 执行状态:SUCCESS(成功)、FAILED(失败)、RUNNING(执行中) |
|
|||
|
|
|||
|
#### 连接示例
|
|||
|
|
|||
|
##### JavaScript客户端示例
|
|||
|
|
|||
|
```javascript
|
|||
|
// 建立WebSocket连接
|
|||
|
const taskRecordId = "your-task-record-id";
|
|||
|
const interval = 2; // 推送间隔2秒
|
|||
|
const wsUrl = `ws://localhost:8000/ws/task-execution/${taskRecordId}?interval=${interval}`;
|
|||
|
|
|||
|
const websocket = new WebSocket(wsUrl);
|
|||
|
|
|||
|
// 连接建立
|
|||
|
websocket.onopen = function(event) {
|
|||
|
console.log("WebSocket连接已建立");
|
|||
|
|
|||
|
// 发送心跳包
|
|||
|
websocket.send(JSON.stringify({
|
|||
|
type: "ping",
|
|||
|
timestamp: new Date().toISOString()
|
|||
|
}));
|
|||
|
};
|
|||
|
|
|||
|
// 接收消息
|
|||
|
websocket.onmessage = function(event) {
|
|||
|
const data = JSON.parse(event.data);
|
|||
|
|
|||
|
switch(data.type) {
|
|||
|
case "task_execution_update":
|
|||
|
console.log("任务执行结果更新:", data.data);
|
|||
|
break;
|
|||
|
case "pong":
|
|||
|
console.log("心跳响应:", data.timestamp);
|
|||
|
break;
|
|||
|
case "error":
|
|||
|
console.error("服务器错误:", data.message);
|
|||
|
break;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// 连接关闭
|
|||
|
websocket.onclose = function(event) {
|
|||
|
console.log("WebSocket连接已关闭");
|
|||
|
};
|
|||
|
|
|||
|
// 连接错误
|
|||
|
websocket.onerror = function(error) {
|
|||
|
console.error("WebSocket连接错误:", error);
|
|||
|
};
|
|||
|
```
|
|||
|
|
|||
|
##### Python客户端示例
|
|||
|
|
|||
|
```python
|
|||
|
import asyncio
|
|||
|
import json
|
|||
|
import websockets
|
|||
|
|
|||
|
async def websocket_client():
|
|||
|
task_record_id = "your-task-record-id"
|
|||
|
interval = 2
|
|||
|
uri = f"ws://localhost:8000/ws/task-execution/{task_record_id}?interval={interval}"
|
|||
|
|
|||
|
async with websockets.connect(uri) as websocket:
|
|||
|
print("WebSocket连接已建立")
|
|||
|
|
|||
|
# 发送心跳包
|
|||
|
await websocket.send(json.dumps({
|
|||
|
"type": "ping",
|
|||
|
"timestamp": datetime.now().isoformat()
|
|||
|
}))
|
|||
|
|
|||
|
# 监听消息
|
|||
|
async for message in websocket:
|
|||
|
data = json.loads(message)
|
|||
|
|
|||
|
if data["type"] == "task_execution_update":
|
|||
|
print(f"任务执行结果更新: {data['data']}")
|
|||
|
elif data["type"] == "pong":
|
|||
|
print(f"心跳响应: {data['timestamp']}")
|
|||
|
elif data["type"] == "error":
|
|||
|
print(f"服务器错误: {data['message']}")
|
|||
|
|
|||
|
# 运行客户端
|
|||
|
asyncio.run(websocket_client())
|
|||
|
```
|
|||
|
|
|||
|
#### 特性说明
|
|||
|
|
|||
|
1. **智能推送**:服务器只在数据发生变化时才推送更新,避免不必要的网络流量
|
|||
|
2. **心跳检测**:支持客户端主动发送心跳包,维持连接活跃状态
|
|||
|
3. **错误处理**:完善的错误处理机制,连接异常时自动清理资源
|
|||
|
4. **状态查询**:客户端可随时主动请求获取当前任务状态
|
|||
|
5. **多客户端支持**:同一任务记录可支持多个客户端同时连接
|
|||
|
|
|||
|
### 2. 任务执行结果广播
|
|||
|
|
|||
|
#### 接口说明
|
|||
|
|
|||
|
建立WebSocket连接,接收任务执行结果的广播消息。与实时推送接口的区别在于,此接口主要用于被动接收广播,不会主动定期推送。
|
|||
|
|
|||
|
#### 连接路径
|
|||
|
|
|||
|
```
|
|||
|
ws://your-domain/ws/task-execution-broadcast/{task_record_id}
|
|||
|
```
|
|||
|
|
|||
|
#### 路径参数
|
|||
|
|
|||
|
| 参数名 | 类型 | 是否必须 | 描述 |
|
|||
|
| --- | --- | --- | --- |
|
|||
|
| task_record_id | string | 是 | 任务记录ID |
|
|||
|
|
|||
|
#### 客户端消息格式
|
|||
|
|
|||
|
##### 心跳检测
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "ping",
|
|||
|
"timestamp": "2025-06-11T12:00:00.000Z"
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
#### 服务器消息格式
|
|||
|
|
|||
|
与任务执行结果实时推送接口相同,参见上述文档。
|
|||
|
|
|||
|
#### 使用场景
|
|||
|
|
|||
|
1. **监控面板**:多个监控客户端同时监听任务状态变化
|
|||
|
2. **日志收集**:收集任务执行过程中的状态变化记录
|
|||
|
3. **事件通知**:当任务状态发生变化时接收通知
|
|||
|
|
|||
|
## 错误码说明
|
|||
|
|
|||
|
| 错误码 | 描述 | 解决方案 |
|
|||
|
| --- | --- | --- |
|
|||
|
| 1006 | 连接异常关闭 | 检查网络连接,重新建立连接 |
|
|||
|
| 1011 | 服务器内部错误 | 检查服务器状态和日志 |
|
|||
|
| 1013 | 临时服务不可用 | 稍后重试连接 |
|
|||
|
|
|||
|
## 最佳实践
|
|||
|
|
|||
|
### 1. 连接管理
|
|||
|
|
|||
|
- 实现连接断开后的自动重连机制
|
|||
|
- 合理设置推送间隔,避免过于频繁的请求
|
|||
|
- 及时关闭不需要的连接,释放服务器资源
|
|||
|
|
|||
|
### 2. 错误处理
|
|||
|
|
|||
|
- 监听`onerror`和`onclose`事件,处理连接异常
|
|||
|
- 实现重连退避策略,避免连接风暴
|
|||
|
- 记录错误日志,便于问题排查
|
|||
|
|
|||
|
### 3. 性能优化
|
|||
|
|
|||
|
- 使用合适的推送间隔(建议2-5秒)
|
|||
|
- 客户端及时处理接收到的消息,避免消息积压
|
|||
|
- 对于不活跃的任务,考虑降低推送频率
|
|||
|
|
|||
|
### 4. 安全考虑
|
|||
|
|
|||
|
- 在生产环境中使用WSS协议(WebSocket Secure)
|
|||
|
- 实现适当的身份验证和授权机制
|
|||
|
- 限制连接数量,防止资源滥用
|
|||
|
|
|||
|
## 注意事项
|
|||
|
|
|||
|
1. **任务记录ID有效性**:确保传入的任务记录ID存在且有效
|
|||
|
2. **网络稳定性**:WebSocket连接对网络质量要求较高,不稳定的网络可能导致频繁断连
|
|||
|
3. **浏览器兼容性**:确保目标浏览器支持WebSocket协议
|
|||
|
4. **资源清理**:页面关闭或组件销毁时,及时关闭WebSocket连接
|
|||
|
5. **消息处理**:合理处理接收到的消息,避免阻塞UI线程
|
|||
|
|
|||
|
## 更新日志
|
|||
|
|
|||
|
| 版本 | 日期 | 更新内容 |
|
|||
|
| --- | --- | --- |
|
|||
|
| 1.0.0 | 2025-06-11 | 初始版本,支持任务执行结果实时推送和广播功能 |
|