首页  >  文章  >  后端开发  >  如何在 Go 中中止长轮询 POST 请求?

如何在 Go 中中止长轮询 POST 请求?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-26 00:23:13799浏览

How Can I Abort Long-Polling POST Requests in Go?

Go 中中止长轮询请求的技术

在长轮询的情况下,客户端-服务器连接长时间保持活动状态,可能会有必要提前终止客户端的请求。虽然 http.Client 库为长轮询提供了默认的阻塞行为,但出现了问题:如何在完全收到响应之前取消或中止 POST 请求?

调用 resp.Body 的传统方法不鼓励使用 .Close() 过早关闭响应,因为它需要通过另一个 goroutine 进行额外的编排。此外,使用 http.Transport 的超时功能可能不符合用户发起的取消的需求。

幸运的是,Go 生态系统已经发展到通过 http.Request.WithContext 提供更简化的解决方案。这允许客户端为请求指定一个有时限的上下文,从而能够优雅地终止以响应外部事件。下面的代码片段演示了这种方法:

// Create a new request with an appropriate context, using a deadline to terminate after a specific duration.
req, err := http.NewRequest("POST", "http://example.com", nil)
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
req = req.WithContext(ctx)
err = client.Do(req)
if err != nil {
    // Handle the error, which may indicate a premature termination due to the context deadline.
}

通过在上下文对象上调用cancel(),可以随时中止请求,从而触发长轮询的终止。这为用户控制的 HTTP POST 请求取消提供了可靠且高效的机制。

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

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