以下是一个基于 Java 的完整示例,演示如何通过 WebSocket 接入Infoway API提供的实时行情接口,并展示如加密货币 BTC/USDT 的实时价格更新。
步骤 1:准备工作
申请免费 API Key
阅读接入文档(可选)
Java 环境准备:
JDK 11+
添加
jakarta.websocket
依赖添加 fastjson2 依赖(用于构造/解析 JSON)
步骤 2:建立 WebSocket 连接
WebSocket 地址如下:
private static final String WS_URL = "wss://data.infoway.io/ws?business=crypto&apikey=yourApikey";
// 申请API Key: www.infoway.io
替换 yourApikey
为你实际申请的 API Key。
使用 WebSocketContainer
发起连接:
// 申请API Key: www.infoway.io
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
session = container.connectToServer(MyClientEndpoint.class, URI.create(WS_URL));
步骤 3:订阅你需要的行情
以订阅 BTC/USDT 为例:
// 申请API Key: www.infoway.io
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", 10000);
jsonObject.put("trace", "trace-id");
JSONObject data = new JSONObject();
data.put("codes", "BTCUSDT");
jsonObject.put("data", data);
session.getBasicRemote().sendText(jsonObject.toJSONString());
code=10000
表示订阅,trace
可为任意唯一字符串。
步骤 4:处理服务器推送的数据
实现 @ClientEndpoint
并监听 @OnMessage
:
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Message received: " + message);
}
数据结构是 JSON 格式,具体字段可按需解析后传入你的前端展示组件(例如 ECharts、Grafana 等)。
步骤 5:保持连接活跃(发送 ping)
该接口要求每隔 30 秒发送一次 ping 消息:
ScheduledExecutorService pingExecutor = Executors.newScheduledThreadPool(1);
Runnable pingTask = WebsocketExample::ping;
pingExecutor.scheduleAtFixedRate(pingTask, 30, 30, TimeUnit.SECONDS);
ping 消息格式:
jsonObject.put("code", 10010);
jsonObject.put("trace", "trace-id");
步骤 6:保持运行 & 自动重连
目前示例通过 Thread.sleep(600000)
方式保持连接。如果用于生产建议增加自动重连逻辑,在 @OnClose
或 @OnError
中处理。
注意事项:看板接入行情 API 的常见坑
在实际开发和部署中,以下问题容易被忽视,但会直接影响你看板系统的稳定性和用户体验:
1. WebSocket 心跳机制不可忽略
许多行情 API(包括 Infoway)要求客户端定期发送 ping 保活,否则服务端会断开连接。一定要确保你的 ping 定时器是稳定运行的,不能依赖前端 ping 来替代后端的连接保活。
2. 异常重连机制必须做
网络断开、接口变更或服务端关闭连接都是常态。你的看板系统应在 @OnClose
或 @OnError
中自动重连,不能指望连接永久不掉。
3. 订阅管理要清晰
有些看板需要同时展示多个币种、股票或期货行情,避免重复订阅同一个标的代码。否则将造成资源浪费,甚至触发风控限流。
4. 数据频率 ≠ 数据完整性
有些行情接口虽然推送频率高,但并不保证完整的 Tick 数据。要明白你接收到的是报价(Quote)还是实际成交(Trade),不同用途要用不同接口。
5. UI 性能瓶颈要提前考虑
如果你展示的数据量大(比如秒级 K 线或多图表并发刷新),前端会成为瓶颈。建议采用节流(throttle)、批量刷新或 Web Worker 等优化手段。
6. Trace ID 不可硬编码
虽然官方示例里用了硬编码的 trace
字符串,但实际使用中建议使用随机 UUID 保持唯一性,方便后续追踪和日志排查。