如何使用 JavaScript 接入实时行情 API

对于开发者来说,实时数据是构建动态应用程序的关键。本教程将指导您如何使用 JavaScript 和 WebSocket 协议接入实时行情 API,以便您的应用能够即时获取最新的市场数据。

1. 什么是 WebSocket?

在深入代码之前,我们先了解一下 WebSocket 。与传统的 HTTP 请求-响应模式不同,WebSocket 提供了一个全双工通信通道。这意味着一旦连接建立,服务器和客户端可以随时互相发送消息,而无需每次都重新建立连接。这使得 WebSocket 非常适合需要实时数据更新的场景,例如股票行情、聊天应用或在线游戏。

2. 准备工作

由于示例代码使用了 ws 库,这是一个流行的 WebSocket 客户端库,您需要先安装它。在您的项目目录下打开终端并运行以下命令:

python 复制代码
npm install ws

3. 逐步接入实时行情 API

接下来,我们将根据提供的代码示例,一步步讲解如何接入实时行情 API。

步骤 1:引入 WebSocket 库并设置连接 URL

首先,您需要引入 ws 库,并定义 API 的 WebSocket URL。请注意,yourApikey 需要替换为您从 API 提供商处获得的实际 API 密钥。

python 复制代码
const WebSocket = require('ws');
const wsUrl = 'wss://data.infoway.io/ws?business=crypto&apikey=yourApikey'; 
// 请替换 'yourApikey' 为您的实际 API 密钥
// 申请API KEY: www.infoway.io

步骤 2:建立 WebSocket 连接

使用 new WebSocket(wsUrl) 创建一个新的 WebSocket 实例,这将尝试与指定的 URL 建立连接。

python 复制代码
const ws = new WebSocket(wsUrl);

步骤 3:监听连接事件

WebSocket 实例提供了几个事件,您可以监听这些事件来处理连接的生命周期。

  • ws.on('open', () => { ... });: 当 WebSocket 连接成功建立时触发。这是发送初始订阅消息的最佳时机。
  • ws.on('message', (data) => { ... });: 每当从服务器接收到新消息时触发。您将在这里处理实时行情数据。
  • ws.on('close', (code, reason) => { ... }); : 当连接关闭时触发。您可以根据 codereason 来判断关闭的原因。
  • ws.on('error', (error) => { ... });: 当连接发生错误时触发。
python 复制代码
// 连接建立时发送初始消息
ws.on('open', () => {
    console.log('Connection opened');

    // 订阅 BTCUSDT 行情
    const initMessage = JSON.stringify({
        code: 10000, // 订阅消息的业务代码,10000代表订阅逐笔行情数据,详情见对接文档:docs.infoway.io
        trace: '01213e9d-90a0-426e-a380-ebed633cba7a', // 唯一的跟踪 ID
        data: { codes: 'BTCUSDT' } // 您想要订阅的交易对
    });

    ws.send(initMessage);

    // 设置定时 ping,保持连接活跃
    setInterval(() => {
        const pingMessage = JSON.stringify({
            code: 10010, // Ping 消息的业务代码
            trace: '01213e9d-90a0-426e-a380-ebed633cba7a'
        });
        ws.send(pingMessage);
    }, 30000); // 每 30 秒发送一次 ping

    // 示例:10 分钟后关闭连接
    setTimeout(() => {
        ws.close();
    }, 600000); // 600000 毫秒 = 10 分钟
});

// 接收消息处理
ws.on('message', (data) => {
    console.log('Message received:', data);
    // 在这里解析并处理收到的行情数据
    try {
        const message = JSON.parse(data);
        // 根据 message 的结构进行处理,例如:
        // if (message.code === 20000) { // 假设 20000 是行情数据的代码
        //     console.log('实时价格:', message.data.price);
        // }
    } catch (e) {
        console.error('Failed to parse message:', data, e);
    }
});

// 连接关闭处理
ws.on('close', (code, reason) => {
    console.log('Connection closed (' + code + '): ' + reason);
    // 可以在这里实现重连逻辑
});

// 错误处理
ws.on('error', (error) => {
    console.error('WebSocket error:' + error);
});

步骤 4:发送订阅消息和心跳包 (Ping/Pong)

  • 订阅消息 (initMessage) : 在连接建立后,您需要向 API 发送一条消息,告诉它您希望订阅哪些行情数据(例如 BTCUSDT)。消息的 codedata 字段的具体内容需要参照您使用的 API 文档。
  • 心跳包 (pingMessage) : 为了保持 WebSocket 连接的活跃,许多实时 API 要求客户端定期发送心跳包 (Ping)。这可以防止连接因为长时间不活动而被服务器关闭。示例中每 30 秒发送一次 ping

步骤 5:处理接收到的行情数据

当您从服务器接收到消息时,ws.on('message') 事件会被触发。data 参数通常是 Buffer 类型,您需要将其转换为字符串,然后解析为 JSON 对象。之后,您可以根据 API 文档中定义的消息结构来提取和处理行情数据。


4. 注意事项

错误处理和重连机制

在实际应用中,网络连接可能会不稳定。您需要实现健壮的错误处理和自动重连机制,以确保在连接中断时能够恢复服务。在 ws.on('close')ws.on('error') 事件中添加重连逻辑是关键。

数据解析

不同的实时行情 API 返回的数据格式可能不同,比如实时K线和逐笔成交的数据格式不一样,详情可以看官方对接文档(docs.infoway.io)。

消息频率和限制

HTTP请求和WS订阅均存在一定的请求频率限制,比如免费用户的HTTP请求是1秒1次,WS连接最大订阅产品数量是10个,付费套餐的权限会更高。

生产环境部署

在生产环境中,您可能需要考虑使用 PM2 等进程管理器来管理您的 Node.js 应用程序,以确保它持续运行并处理潜在的崩溃。

相关推荐
人工智能训练4 小时前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
yaoming1684 小时前
python性能优化方案研究
python·性能优化
会跑的葫芦怪5 小时前
若依Vue 项目多子路径配置
前端·javascript·vue.js
码云数智-大飞5 小时前
使用 Python 高效提取 PDF 中的表格数据并导出为 TXT 或 Excel
python
xiaoqi9226 小时前
React Native鸿蒙跨平台如何进行狗狗领养中心,实现基于唯一标识的事件透传方式是移动端列表开发的通用规范
javascript·react native·react.js·ecmascript·harmonyos
jin1233226 小时前
React Native鸿蒙跨平台剧本杀组队消息与快捷入口组件,包含消息列表展示、快捷入口管理、快捷操作触发和消息详情预览四大核心功能
javascript·react native·react.js·ecmascript·harmonyos
biuyyyxxx7 小时前
Python自动化办公学习笔记(一) 工具安装&教程
笔记·python·学习·自动化
极客数模7 小时前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
烬头88218 小时前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
pas1368 小时前
40-mini-vue 实现三种联合类型
前端·javascript·vue.js