首页  >  文章  >  后端开发  >  Go 中如何检查 HTTP 请求是否被取消?

Go 中如何检查 HTTP 请求是否被取消?

DDD
DDD原创
2024-11-07 14:54:03334浏览

How to Check if an HTTP Request Was Cancelled in Go?

如何检查请求是否被取消

上下文和取消

在 Go 中,上下文提供了一种控制和取消操作的机制。它们允许通过 goroutine 和 HTTP 请求传播取消信号。

问题

在上下文中使用 HTTP 请求时,正确处理取消至关重要。在 Go 1.9 中,尝试使用 err == context.Canceled 检查请求是否被取消可能会导致错误的结果。

解决方案

在 Go 1.13 中:

检查取消的首选方法是使用新的错误。Is 函数:

ctx, cancel := context.WithCancel(context.Background())
cancel()

r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

_, err := http.DefaultClient.Do(r)
log.Println(errors.Is(err, context.Canceled)) // Prints true

errors.Is 检查错误链,如果链中的任何错误与提供的上下文匹配,则返回 true .已取消错误。

在 Go 1.9-1.12 中:

对于早期版本的 Go,您可以使用以下解决方法:

type canceledErr struct {
    error
}

func (e *canceledErr) Cancelled() bool {
    return e.Error() == "context canceled"
}

func main() {
    r, _ := http.NewRequest("GET", "http://example.com", nil)
    ctx, cancel := context.WithCancel(context.Background())
    r = r.WithContext(ctx)
    ch := make(chan bool)
    go func() {
        _, err := http.DefaultClient.Do(r)
        ch <- &canceledErr{err}
    }()
    cancel()
    log.Println((<-ch).Cancelled()) // Prints true
}

此解决方法创建一个自定义错误类型canceledErr,它嵌入包装的错误并提供Cancelled() 方法来检查上下文取消。

以上是Go 中如何检查 HTTP 请求是否被取消?的详细内容。更多信息请关注PHP中文网其他相关文章!

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