使用gorilla/websocket订阅websocket

3
我想使用一些 Binance API 的 WebSocket 流。我在这里发帖是因为我认为这不是 API 的问题,而是我对 WebSockets 的理解有误
我尝试订阅一个流,就像 官方 gorilla/websocket 示例 中描述的那样:
conn, res, err := websocket.DefaultDialer.Dial("wss://stream.binance.com/ws/BTCUSD@markPrice", nil)

fmt.Println(conn)
fmt.Println(res)
fmt.Println(err)

for {
    _, message, readErr := conn.ReadMessage()
    if readErr != nil {
        fmt.Println(readErr)
        return
    }
    fmt.Println(message)
}

连接已成功创建,但之后没有读取到任何消息。

我认为问题在于API要求我订阅流,如下所示:

{
    "method": "SUBSCRIBE",
    "params": [
        "btcusdt@aggTrade",
        "btcusdt@depth"
    ],
    "id": 1
}

我知道websocket连接从一个HTTP请求开始,而在这个请求中,据我所理解,我发送这些数据。但是我应该在何时何地发送呢?Dial没有提供除HTTP头之外的任何选项。
更新: 通过使用Conn.WriteJSON,我成功发送了正确的请求并得到了正确的响应,详情请参见文档here.
type request struct {
    Method string    `json:"method"`
    Params [1]string `json:"params"`
    ID     int       `json:"id"`
}

markPriceReq := request{"SUBSCRIBE", [1]string{"btcusdt@markPrice"}, 1}
conn.WriteJSON(markPriceReq)

然而,初始响应后不再读取数据。我从哪里获取实际的标记价格数据?


1
写入连接的订阅。https://godoc.org/github.com/gorilla/websocket#Conn.WriteJSON - Charlie Tumahai
@MuffinTop 谢谢!我现在得到了正确的响应 { "result": null, "id": 1 },就像API文档中描述的那样。然而,我仍然不知道在哪里读取实际数据 :/ - Jan Berndt
调用ReadMessage(如问题所示)或ReadJSON(如果您想解码JSON)。 - Charlie Tumahai
1个回答

4
您的连接地址存在问题。
所有流的符号都必须为小写字母,并且您在发布文档链接中提供的 ws 基础终端点是 wss://stream.binancefuture.com (永续合约/永续合约测试网 ws 终端点),但您正在使用 wss://stream.binance.com (杠杆/现货/储蓄/挖矿 ws 终端点) 。
标记价格流仅适用于永续合约/永续合约测试网 ws 终端点。 我使用 原始流 urlwss://stream.binancefuture.com/ws/btcusdt@markPrice 没有任何问题。
这个请求用于实时订阅/取消订阅,您只有在已经连接到币安ws并想要订阅更多流或取消订阅流时才会使用它。
{
    "method": "SUBSCRIBE",
    "params": [
        "btcusdt@aggTrade",
        "btcusdt@depth"
    ],
    "id": 1
}

不必使用实时订阅/取消订阅功能,只需像上面那样使用原始URL即可:wss://stream.binancefuture.com/ws/<streamName> (仅一个流) 或 wss://stream.binancefuture.com/stream?streams=<streamName1>/<streamName2>/<streamName3> (多个流组合)
通过使用原始URL,您可以访问<streamName>(之后也可以发送请求使用实时订阅/取消订阅)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接