Go 中使用 HTTP 请求体进行客户端取消
处理 HTTP 请求时,能够优雅地响应客户端取消信号非常重要资源管理。虽然 Go 的 context 包提供了捕获取消的机制,但在某些情况下它可能不会按预期运行。
为什么 GET 和 POST 请求不同
GET 之间的行为差异和 POST 请求源于 HTTP 处理请求的方式服务器。
使用请求主体捕获取消
要捕获带有主体的请求的取消信号,立即开始读取请求主体至关重要。 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中文网其他相关文章!