手记

如何使用API查询虚拟货币的实时行情

在当今的数字货币市场中,实时行情数据对交易者和投资者至关重要。通过API查询虚拟货币的实时价格,用户可以获取市场的最新波动信息,从而更好地制定交易策略、分析市场趋势,并实现高效的自动化交易。API通常提供实时的价格更新、K线数据、成交量等关键市场数据,帮助交易者随时掌握市场动态。

这里我们将使用Java调取外部接口,查询虚拟币的实时行情。实时行情指的是即时获取的市场价格和成交数据,这些数据在交易发生后立即更新,通常几秒内(有些高频交易专用的接口能干到一秒以内)就能传递给用户。

相对而言,延时行情通常会有一段时间的延迟,最常见的是15分钟的延时。延时行情主要用于满足普通投资者或数据分析需求,因为它不具备实时交易的及时性,但仍然可以提供市场的大致走势。延时行情是比较常见的,我们平时看的财经网站、或者股票交易软件上的行情基本都属于延时数据。

接口申请地址:https://infoway.io
Github地址:https://github.com/infoway-api/realtime-market-data-api

HTTP请求

下面我们试着通过接口查询狗狗币(DOGE)的行情

package org.example.ws;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpExample {
    public static void main(String[] args) {
        try {
            // 定义请求URL
            String apiUrl = "https://data.infoway.io/crypto/batch_kline/1/10/DOGE_USDT";
            URL url = new URL(apiUrl);

            // 创建HTTP连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 设置请求方法为GET
            connection.setRequestMethod("GET");

            // 设置请求头(可选)
            connection.setRequestProperty("User-Agent", "Mozilla/5.0");
            connection.setRequestProperty("Accept", "application/json");

            connection.setRequestProperty("apiKey","yourApikey");

            // 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("HTTP code: " + responseCode);

            // 读取响应内容
            BufferedReader reader;
            if (responseCode == HttpURLConnection.HTTP_OK) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

            String line;
            StringBuilder response = new StringBuilder();

            while ((line = reader.readLine()) != null) {
                response.append(line);
            }

            reader.close();

            // 打印响应内容
            System.out.println("message: " + response);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这段代码的基础逻辑是通过Java发起HTTP请求,查询指定虚拟货币的行情数据。代码步骤如下:

构建URL:代码中定义了API的请求URL,包含查询参数(例如交易对DOGEUSDT)和API访问令牌(token)。
建立HTTP连接:使用HttpURLConnection类建立到API服务器的连接,并指定请求方法为GET。
获取响应:发送请求后,代码通过getResponseCode()方法检查服务器的响应状态,并通过输入流InputStream读取API的返回数据。
输出结果:将API返回的JSON格式数据逐行读取并拼接到字符串中,最后打印出来,供后续解析或使用。

WebSockets

WebSocket是一种全双工通信协议,允许客户端和服务器之间建立持久的连接,从而实现实时数据传输。相比于传统的HTTP轮询,WebSocket具有以下优势:

  • 实时性高:一旦建立连接,服务器可以实时地向客户端推送数据,极大地降低了延迟。尤其在金融市场和在线游戏等对数据更新频率要求较高的场景中,WebSocket是理想选择。

  • 高效性:WebSocket建立一次连接后即可持续通信,避免了HTTP协议中的频繁握手。这样不仅减少了请求的开销,还减轻了服务器的负担。

  • 低延迟与节省带宽:WebSocket传输的是较少的头信息,节省了网络带宽,适合高频次、低延迟的数据传输,如价格行情更新、消息通知等。

下面我们通过WebSockts来订阅比特币(BTC)的行情数据:

package org.example.ws;

import com.alibaba.fastjson2.JSONObject;
import jakarta.websocket.*;

import java.io.IOException;
import java.net.URI;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class WebsocketExample {

    private static Session session;

    private static final String WS_URL = "wss://data.infoway.io/ws?business=crypto&apikey=YourAPIKey";

    public static void main(String[] args) throws Exception {
        try {
            // create WebSocket connect
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            session = container.connectToServer(WebsocketExample.MyClientEndpoint.class, URI.create(WS_URL));
            // send message

            JSONObject jsonObject = new JSONObject();
            jsonObject.put("code", 10000);
            jsonObject.put("trace", "01213e9d-90a0-426e-a380-ebed633cba7a");
            JSONObject data = new JSONObject();
            data.put("codes", "BTCUSDT");
            jsonObject.put("data", data);

            session.getBasicRemote().sendText(jsonObject.toJSONString());

            ScheduledExecutorService pingExecutor = Executors.newScheduledThreadPool(1);
            Runnable pingTask = WebsocketExample::ping;
            pingExecutor.scheduleAtFixedRate(pingTask, 30, 30, TimeUnit.SECONDS);

            // keep running
            Thread.sleep(600 * 1000);
            // close connect
            session.close();
        } catch (DeploymentException | IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    @ClientEndpoint
    public static class MyClientEndpoint {
        @OnOpen
        public void onOpen(Session session) {
            System.out.println("Connection opened: " + session.getId());
        }

        @OnMessage
        public void onMessage(String message, Session session) {
            try {
                System.out.println("Message received: " + message);
            } catch (Exception e) {
            }
        }

        @OnClose
        public void onClose(Session session, CloseReason reason) {
            System.out.println("Connection closed: " + session.getId() + ", reason: " + reason);
        }

        @OnError
        public void onError(Throwable error) {
            error.printStackTrace();
        }
    }

    //ping message
    public static void ping() {
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("code", 10010);
            jsonObject.put("trace", "01213e9d-90a0-426e-a380-ebed633cba7a");
            session.getBasicRemote().sendText(jsonObject.toJSONString());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

这段代码的基本流程如下:

  1. 定义WebSocket客户端:使用@ClientEndpoint注解将WebSocketJavaExample类标记为WebSocket客户端,并定义了一些事件处理方法(如onOpen、onMessage、onClose、onError)用于处理不同的WebSocket连接事件。
  2. 连接到服务器:在main方法中,使用WebSocketContainer建立到WebSocket服务器的连接(在这里为行情数据服务器)。连接的URL中包含了API令牌,确保服务器验证用户身份。
  3. 发送订阅请求:建立连接后,通过sendMessage方法发送订阅消息,以请求服务器提供BTCUSDT(比特币/美元)交易对的实时行情数据。消息内容使用JSON格式,并指定了需要的交易对(BTCUSDT)和深度级别等参数。
  4. 接收并处理消息:当服务器返回行情数据时,onMessage方法会被调用,打印出接收到的行情信息。通过这种方式,客户端可以持续接收BTCUSDT的实时价格更新。
  5. 关闭连接:当连接被关闭或发生错误时,onClose和onError方法会被触发,输出相应信息。
0人推荐
随时随地看视频
慕课网APP