首页 >后端开发 >Golang >如何在 Go 中取消长轮询 HTTP 请求?

如何在 Go 中取消长轮询 HTTP 请求?

Linda Hamilton
Linda Hamilton原创
2024-12-01 00:10:15915浏览

How Can I Cancel a Long-Polling HTTP Request in Go?

在 Golang 中取消长轮询

使用 http.Client 实现客户端长轮询时,通常需要这样做能够提前取消请求。这可以通过从单独的 Goroutine 手动调用 resp.Body.Close() 来实现,但这不是一个标准且优雅的解决方案。

使用请求上下文取消

在 Golang 中取消 HTTP 请求的更惯用的方法是使用请求上下文。通过传递带有截止日期或取消函数的上下文,可以从客户端取消请求。下面的代码演示了如何使用请求上下文来取消长轮询请求:

import (
    "context"
    "net/http"
)

func main() {
    // Create a new HTTP client with a custom transport.
    client := &http.Client{
        Transport: &http.Transport{
            // Set a timeout for the request.
            Dial: (&net.Dialer{Timeout: 5 * time.Second}).Dial,
            TLSHandshakeTimeout: 5 * time.Second,
        },
    }

    // Create a new request with a context that can be cancelled.
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

    req, err := http.NewRequest("POST", "http://example.com", nil)
    if err != nil {
        panic(err)
    }
    req = req.WithContext(ctx)

    // Start the request in a goroutine and cancel it after 5 seconds.
    go func() {
        _, err := client.Do(req)
        if err != nil {
            // Handle the canceled error.
        }
    }()

    time.Sleep(5 * time.Second)
    cancel()
}

当调用cancel()函数时,请求将被取消,并且传输中指定的Dial和TLSHandshakeTimeout将会受到尊重。

以上是如何在 Go 中取消长轮询 HTTP 请求?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn