使用 POST 请求进行 http 上下文和请求取消
当客户端发送不带正文的 GET 请求时,服务器能够检测到当客户端关闭连接时发出取消信号。这是通过读取请求正文并检测客户端何时断开连接来完成的。
但是,当客户端发送带有请求正文的 POST 请求时,服务器无法立即检测到取消信号。这是因为服务器在应用程序显式读取请求正文之前不会开始读取请求正文。因此,在请求截止日期之前,服务器无法捕获取消信号。
要解决此问题并使用 Go 上下文包正确处理取消,立即读取请求正文 。这确保服务器可以检测到客户端何时断开连接,并可以尽快取消任何不必要的工作。通过读取 POST 请求的正文,您可以触发服务器的连接检查以开始读取连接并检测已关闭的连接。
以下示例演示了如何修改代码以读取请求正文并捕获及时取消信号:
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 time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
通过显式读取请求体,一旦客户端关闭连接,服务器就可以检测到取消信号,从而可以及时释放服务器上的资源侧面。
以上是Go 的 Context 包如何改进 POST 请求取消处理?的详细内容。更多信息请关注PHP中文网其他相关文章!