Golang Go语言中,golang的http请求,transport.CancelRequest与client.Timeout有冲突

发布于 1周前 作者 h691938207 来自 Go语言

Golang Go语言中,golang的http请求,transport.CancelRequest与client.Timeout有冲突

两个需求:

  1. 用户可以随时终止请求。
  2. 用户可以修改超时值,比如 20s ;

对于第一个需求,设置了 client.Transport,并在合适的位置调用其 CancelRequest()接口; 对于第二个需求,设置了 client.Timeout ;

但是调试中发现,如果设置了 client.Timeout,则 Transport.CancelRequest()就不再起效。 注释掉 Timeout 就可以生效。

代码如下:

package main

import ( “fmt” “net/http” “time” )

func main() { trans := &http.Transport{} client := &http.Client{ Transport: trans, Timeout: time.Second * (30), // 这一行不注释就无法 CancelRequest } req, err := http.NewRequest(“GET”, “https://www.google.com”, nil) if err != nil { panic(err) }

go func() {
	time.Sleep(time.Second * time.Duration(1))
	fmt.Printf("%v: abort\n", time.Now())
	trans.CancelRequest(req)
}()

fmt.Printf("%v: start ...\n", time.Now())
_, err = client.Do(req)
fmt.Printf("%v: done\n", time.Now())
if err != nil {
	fmt.Println(err.Error())
}

}

请问我该怎么办?


更多关于Golang Go语言中,golang的http请求,transport.CancelRequest与client.Timeout有冲突的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

对了,自己不希望用 Timeou 来调用 CanceRequest,还是希望用 client 自己的 timeout 可以么?

更多关于Golang Go语言中,golang的http请求,transport.CancelRequest与client.Timeout有冲突的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


了解下 WithContext 。我在 gout 里面的超时就是用这个 API 实现的。context 可超时取消,可以调用 cancel 取消。
这是官方 WithContext 的文档
https://golang.google.cn/pkg/net/http/#Request.WithContext

## 这是 gout 里面使用 WithContext 的例子
https://github.com/guonaihong/gout/blob/master/_example/05b-cancel.go

Deprecated: Use Request.WithContext to create a request with a cancelable context instead

谢谢各位的回复,我找到了一个比较简单的方法:

<br> c := make(chan struct{})<br> req.Cancel = c<br><br> go func() {<br> time.Sleep(time.Second * time.Duration(1))<br> fmt.Printf("%v: abort\n", time.Now())<br> //trans.CancelRequest(req)<br> close(c) // 用这句取代 CancelRequest<br> }()<br><br>

在Golang的HTTP请求处理中,http.TransportCancelRequest方法和http.ClientTimeout属性确实可以作用于请求的不同方面,但它们并不直接冲突,而是可以在不同场景下共同使用来增强请求的控制能力。

CancelRequesthttp.Transport的一个方法,允许你取消一个正在进行的HTTP请求。这在你需要立即中断一个长时间运行的请求时非常有用,比如用户取消了操作或系统需要释放资源。

http.ClientTimeout属性则定义了整个请求(包括连接、读取响应等)的最大允许时间。如果请求超过这个时间还未完成,客户端会自动取消请求并返回一个错误。

虽然两者功能不同,但在实际应用中,你可能需要同时设置它们以确保请求既能在合理的时间内完成,也能在必要时被手动取消。例如,你可以设置一个较长的Timeout以允许请求有足够的时间完成,同时提供CancelRequest的功能来应对用户取消操作等突发情况。

在使用时,请注意CancelRequest需要在合适的时机被调用,以避免不必要的资源占用和潜在的竞争条件。同时,Timeout的设置也需要根据实际的网络环境和请求特点进行合理调整,以达到最佳的性能和用户体验。

总之,CancelRequestTimeout是互补的功能,可以在不同场景下共同作用于HTTP请求,提高请求处理的灵活性和可靠性。

回到顶部