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

相关推荐
黑土豆几秒前
为什么我要搞一个Markdown导入组件?说出来你可能不信...
前端·javascript·markdown
都叫我大帅哥3 分钟前
当知识图谱遇上RAG:GraphRAG全解指南
python·ai编程
FF-Studio6 分钟前
25年电赛C题 发挥部分 YOLOv8方案&数据集
python·深度学习·yolo
mortimer6 分钟前
Tenacity:一行代码实现简洁优雅的遇错自动重试逻辑
人工智能·python·网络协议
gc_229915 分钟前
学习Python中Selenium模块的基本用法(4:WebDriver常用属性及函数)
python·selenium
Shun_Tianyou16 分钟前
Python Day20 os模块 和 文件操作 及 例题分析
开发语言·数据结构·python·算法
OOQ17 分钟前
python制作的软件工具安装包
python·pyinstaller
典学长编程18 分钟前
前端开发(HTML,CSS,VUE,JS)从入门到精通!第一天(HTML5)
javascript·css·html·html5
前端小咸鱼一条19 分钟前
React的基本语法和原理
前端·javascript·react.js
im_AMBER25 分钟前
Web 开发 08
前端·javascript