如何使用 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 应用程序,以确保它持续运行并处理潜在的崩溃。

相关推荐
东风西巷17 分钟前
Rubick:基于Electron的开源桌面效率工具箱
前端·javascript·electron·软件需求
麻辣清汤18 分钟前
结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
数据库·python·sql·finebi
钢铁男儿28 分钟前
Python 正则表达式(正则表达式和Python 语言)
python·mysql·正则表达式
钢铁男儿37 分钟前
Python 正则表达式实战:解析系统登录与进程信息
开发语言·python·正则表达式
伊织code39 分钟前
PyTorch API 6
pytorch·api·ddp
Miracle_G1 小时前
每日一个知识点:JavaScript 箭头函数与普通函数比较
javascript
unfetteredman1 小时前
Error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found
前端·javascript·vite
前端小趴菜051 小时前
python - range
python
☺����1 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码1
人工智能·python·音视频
前端小趴菜052 小时前
python - 元组常用操作
python