找回密码
 立即注册
首页 业界区 安全 Go接入实时贵金属行情API

Go接入实时贵金属行情API

揭荸 2025-7-4 14:08:00
本文将详细介绍如何使用Go语言接入 Infoway API 获取实时贵金属行情,包括通过 HTTP请求 获取数据和通过 WebSocket 接收实时数据。我们将通过两种方式:HTTP接口和WebSocket接口实现实时贵金属查询。
步骤 1:安装必要的Go依赖包

在开始编码之前,确保安装以下依赖包:

  • gorilla/websocket: 用于处理WebSocket连接。
  • cron: 用于定时任务。
执行以下命令安装这些依赖包:
  1. go get github.com/gorilla/websocket
  2. go get github.com/robfig/cron/v3
复制代码
步骤 2:通过HTTP请求获取贵金属行情数据

2.1 发送HTTP GET请求

在Go中,可以使用net/http库来发送HTTP请求。以下是一个示例,展示如何使用HTTP请求获取实时贵金属行情数据。
  1. package main
  2. import (
  3.         "fmt"
  4.         "io/ioutil"
  5.         "net/http"
  6.         "log"
  7.         "encoding/json"
  8. )
  9. func main() {
  10.         // API URL,包含贵金属代码(如WTI,BRENT)
  11.         // 请在官网www.infoway.io申请API Key
  12.         apiURL := "https://data.infoway.io/common/batch_trade/WTI,BRENT"
  13.         // 创建HTTP客户端
  14.         client := &http.Client{}
  15.         // 创建GET请求
  16.         req, err := http.NewRequest("GET", apiURL, nil)
  17.         if err != nil {
  18.                 log.Fatalf("Error creating request: %v", err)
  19.         }
  20.         // 设置请求头
  21.         req.Header.Set("User-Agent", "GoClient/1.0")
  22.         req.Header.Set("Accept", "application/json")
  23.         req.Header.Set("apiKey", "yourApiKey") // 替换为你的API Key
  24.         // 发送请求
  25.         resp, err := client.Do(req)
  26.         if err != nil {
  27.                 log.Fatalf("Error sending request: %v", err)
  28.         }
  29.         defer resp.Body.Close()
  30.         // 读取响应
  31.         body, err := ioutil.ReadAll(resp.Body)
  32.         if err != nil {
  33.                 log.Fatalf("Error reading response: %v", err)
  34.         }
  35.         // 输出响应数据
  36.         var result map[string]interface{}
  37.         if err := json.Unmarshal(body, &result); err != nil {
  38.                 log.Fatalf("Error unmarshalling response: %v", err)
  39.         }
  40.         // 打印获取的行情数据
  41.         fmt.Println("Received Data:", result)
  42. }
复制代码
步骤 3:通过WebSocket接收实时贵金属行情数据

3.1 WebSocket连接示例

WebSocket提供了持久的双向连接,适用于实时数据流的场景。以下示例展示了如何通过WebSocket连接到Infoway API并接收实时贵金属行情。
  1. package main
  2. import (
  3.         "fmt"
  4.         "log"
  5.         "time"
  6.         "github.com/gorilla/websocket"
  7.         "encoding/json"
  8. )
  9. type Message struct {
  10.         Code  int         `json:"code"`
  11.         Trace string      `json:"trace"`
  12.         Data  interface{} `json:"data"`
  13. }
  14. func main() {
  15.         // WebSocket连接URL
  16.         // 申请免费API Key: www.infoway.io
  17.         wsURL := "wss://data.infoway.io/ws?business=commodity&apikey=yourApiKey" // 替换为你的API URL
  18.         // 连接到WebSocket
  19.         conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
  20.         if err != nil {
  21.                 log.Fatalf("Failed to connect: %v", err)
  22.         }
  23.         defer conn.Close()
  24.         // 订阅贵金属品种(例如WTI、BRENT)
  25.         tradeData := Message{
  26.                 Code: 10000,
  27.                 Trace: "01213e9d-90a0-426e-a380-ebed633cba7a",
  28.                 Data: map[string]interface{}{
  29.                         "codes": []string{"WTI", "BRENT"},
  30.                 },
  31.         }
  32.         err = sendMessage(conn, tradeData)
  33.         if err != nil {
  34.                 log.Fatalf("Error sending message: %v", err)
  35.         }
  36.         // 启动接收消息
  37.         go receiveMessages(conn)
  38.         // 定时发送心跳包
  39.         go startPingRoutine(conn)
  40.         // 阻塞主线程
  41.         select {}
  42. }
  43. func sendMessage(conn *websocket.Conn, msg Message) error {
  44.         // 发送消息
  45.         messageJSON, err := json.Marshal(msg)
  46.         if err != nil {
  47.                 return fmt.Errorf("error marshalling message: %v", err)
  48.         }
  49.         err = conn.WriteMessage(websocket.TextMessage, messageJSON)
  50.         if err != nil {
  51.                 return fmt.Errorf("error sending message: %v", err)
  52.         }
  53.         return nil
  54. }
  55. func receiveMessages(conn *websocket.Conn) {
  56.         // 接收消息
  57.         for {
  58.                 _, message, err := conn.ReadMessage()
  59.                 if err != nil {
  60.                         log.Printf("Error reading message: %v", err)
  61.                         return
  62.                 }
  63.                 log.Printf("Received message: %s", message)
  64.         }
  65. }
  66. func startPingRoutine(conn *websocket.Conn) {
  67.         // 定时发送心跳包
  68.         for {
  69.                 time.Sleep(30 * time.Second)
  70.                 pingMessage := Message{
  71.                         Code: 10010,
  72.                         Trace: "01213e9d-90a0-426e-a380-ebed633cba7a",
  73.                 }
  74.                 err := sendMessage(conn, pingMessage)
  75.                 if err != nil {
  76.                         log.Printf("Error sending ping: %v", err)
  77.                 }
  78.         }
  79. }
复制代码
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册