使用 gorilla/websocket 订阅 websocket

Che*_*ery 4 go websocket

我想使用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)
}
Run Code Online (Sandbox Code Playgroud)

连接创建时没有错误,但之后就不会读取任何消息。

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

{
    "method": "SUBSCRIBE",
    "params": [
        "btcusdt@aggTrade",
        "btcusdt@depth"
    ],
    "id": 1
}
Run Code Online (Sandbox Code Playgroud)

我知道 websocket 连接从一个 HTTP 请求开始,据我所知,我发送此数据。但我应该在何时何地这样做呢?Dial不提供发送除 HTTP 标头之外的任何内容的选项。

更新:

我设法使用 Conn.WriteJSON发送正确的请求并获得正确的响应,如此处记录的

{
    "method": "SUBSCRIBE",
    "params": [
        "btcusdt@aggTrade",
        "btcusdt@depth"
    ],
    "id": 1
}
Run Code Online (Sandbox Code Playgroud)

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

Son*_*ynh 5

您的连接网址有问题。

流的所有符号均为小写,您发布的文档链接中的 ws 基本端点是wss://stream.binancefuture.com永久/永久测试网ws 端点),但您正在使用wss://stream.binance.com保证金/现货/储蓄/挖矿ws 端点)。

标记价格流仅适用于永久/永久测试网ws 端点。我使用原始流 urlwss://stream.binancefuture.com/ws/btcusdt@markPrice没有任何问题

此请求用于实时订阅/取消订阅,仅当已连接到 binance ws 并且想要订阅更多流或取消订阅流时才使用此请求。

{
    "method": "SUBSCRIBE",
    "params": [
        "btcusdt@aggTrade",
        "btcusdt@depth"
    ],
    "id": 1
}
Run Code Online (Sandbox Code Playgroud)

您不必使用实时订阅/取消订阅,只需使用上面的原始网址即可:

wss://stream.binancefuture.com/ws/<streamName>(仅一个流)wss://stream.binancefuture.com/stream?streams=<streamName1>/<streamName2>/<streamName3>(组合流)

通过使用原始 url,您可以访问<streamName>(之后您还可以发送使用实时订阅/取消订阅的请求)