本文将详细介绍如何使用Go语言接入 Infoway API 获取实时贵金属行情,包括通过 HTTP请求 获取数据和通过 WebSocket 接收实时数据。我们将通过两种方式:HTTP接口和WebSocket接口实现实时贵金属查询。
步骤 1:安装必要的Go依赖包
在开始编码之前,确保安装以下依赖包:
- gorilla/websocket: 用于处理WebSocket连接。
- cron: 用于定时任务。
执行以下命令安装这些依赖包:- go get github.com/gorilla/websocket
- go get github.com/robfig/cron/v3
复制代码 步骤 2:通过HTTP请求获取贵金属行情数据
2.1 发送HTTP GET请求
在Go中,可以使用net/http库来发送HTTP请求。以下是一个示例,展示如何使用HTTP请求获取实时贵金属行情数据。- package main
- import (
- "fmt"
- "io/ioutil"
- "net/http"
- "log"
- "encoding/json"
- )
- func main() {
- // API URL,包含贵金属代码(如WTI,BRENT)
- // 请在官网www.infoway.io申请API Key
- apiURL := "https://data.infoway.io/common/batch_trade/WTI,BRENT"
- // 创建HTTP客户端
- client := &http.Client{}
- // 创建GET请求
- req, err := http.NewRequest("GET", apiURL, nil)
- if err != nil {
- log.Fatalf("Error creating request: %v", err)
- }
- // 设置请求头
- req.Header.Set("User-Agent", "GoClient/1.0")
- req.Header.Set("Accept", "application/json")
- req.Header.Set("apiKey", "yourApiKey") // 替换为你的API Key
- // 发送请求
- resp, err := client.Do(req)
- if err != nil {
- log.Fatalf("Error sending request: %v", err)
- }
- defer resp.Body.Close()
- // 读取响应
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- log.Fatalf("Error reading response: %v", err)
- }
- // 输出响应数据
- var result map[string]interface{}
- if err := json.Unmarshal(body, &result); err != nil {
- log.Fatalf("Error unmarshalling response: %v", err)
- }
- // 打印获取的行情数据
- fmt.Println("Received Data:", result)
- }
复制代码 步骤 3:通过WebSocket接收实时贵金属行情数据
3.1 WebSocket连接示例
WebSocket提供了持久的双向连接,适用于实时数据流的场景。以下示例展示了如何通过WebSocket连接到Infoway API并接收实时贵金属行情。- package main
- import (
- "fmt"
- "log"
- "time"
- "github.com/gorilla/websocket"
- "encoding/json"
- )
- type Message struct {
- Code int `json:"code"`
- Trace string `json:"trace"`
- Data interface{} `json:"data"`
- }
- func main() {
- // WebSocket连接URL
- // 申请免费API Key: www.infoway.io
- wsURL := "wss://data.infoway.io/ws?business=commodity&apikey=yourApiKey" // 替换为你的API URL
- // 连接到WebSocket
- conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
- if err != nil {
- log.Fatalf("Failed to connect: %v", err)
- }
- defer conn.Close()
- // 订阅贵金属品种(例如WTI、BRENT)
- tradeData := Message{
- Code: 10000,
- Trace: "01213e9d-90a0-426e-a380-ebed633cba7a",
- Data: map[string]interface{}{
- "codes": []string{"WTI", "BRENT"},
- },
- }
- err = sendMessage(conn, tradeData)
- if err != nil {
- log.Fatalf("Error sending message: %v", err)
- }
- // 启动接收消息
- go receiveMessages(conn)
- // 定时发送心跳包
- go startPingRoutine(conn)
- // 阻塞主线程
- select {}
- }
- func sendMessage(conn *websocket.Conn, msg Message) error {
- // 发送消息
- messageJSON, err := json.Marshal(msg)
- if err != nil {
- return fmt.Errorf("error marshalling message: %v", err)
- }
- err = conn.WriteMessage(websocket.TextMessage, messageJSON)
- if err != nil {
- return fmt.Errorf("error sending message: %v", err)
- }
- return nil
- }
- func receiveMessages(conn *websocket.Conn) {
- // 接收消息
- for {
- _, message, err := conn.ReadMessage()
- if err != nil {
- log.Printf("Error reading message: %v", err)
- return
- }
- log.Printf("Received message: %s", message)
- }
- }
- func startPingRoutine(conn *websocket.Conn) {
- // 定时发送心跳包
- for {
- time.Sleep(30 * time.Second)
- pingMessage := Message{
- Code: 10010,
- Trace: "01213e9d-90a0-426e-a380-ebed633cba7a",
- }
- err := sendMessage(conn, pingMessage)
- if err != nil {
- log.Printf("Error sending ping: %v", err)
- }
- }
- }
复制代码 来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |