首页 >后端开发 >Golang >Go 如何处理带有正文的 HTTP 请求中的客户端取消?

Go 如何处理带有正文的 HTTP 请求中的客户端取消?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-07 00:50:11869浏览

How Can Go Handle Client Cancellations in HTTP Requests with Bodies?

Go 中使用 HTTP 请求体进行客户端取消

处理 HTTP 请求时,能够优雅地响应客户端取消信号非常重要资源管理。虽然 Go 的 context 包提供了捕获取消的机制,但在某些情况下它可能不会按预期运行。

为什么 GET 和 POST 请求不同

GET 之间的行为差​​异和 POST 请求源于 HTTP 处理请求的方式服务器。

  • GET: GET 请求没有请求正文,因此服务器可以立即开始处理请求。
  • POST: POST 请求有一个请求主体,服务器必须等待收到完整的主体才能处理该请求request.

使用请求主体捕获取消

要捕获带有主体的请求的取消信号,立即开始读取请求主体至关重要。 Go 的 http 服务器仅在应用程序读取请求正文时检查关闭的连接。

解决方案:

为了确保尽早捕获取消信号,请修改请求处理程序立即开始读取请求正文:

func handler(w http.ResponseWriter, r *http.Request) {
    go func(done <-chan struct{}) {
        <-done
        fmt.Println("message", "client connection has gone away, request got cancelled")
    }(r.Context().Done())

    io.Copy(ioutil.Discard, r.Body) // Read the body to detect closed connections
    time.Sleep(30 * time.Second)
    fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:])
}

此解决方案将开始读取请求正文并同时检查已关闭的连接,从而启用无论请求类型如何,都会捕获取消信号。

以上是Go 如何处理带有正文的 HTTP 请求中的客户端取消?的详细内容。更多信息请关注PHP中文网其他相关文章!

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