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

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

Mary-Kate Olsen
发布: 2024-12-07 00:50:11
原创
881 人浏览过

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 服务器仅在应用程序读取请求正文时检查关闭的连接。

解决方案:

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

1

2

3

4

5

6

7

8

9

10

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板