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

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

DDD
发布: 2024-11-07 14:54:03
原创
419 人浏览过

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

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