golang提供的http get、post请求是没有设置超时的,但实现生产环境一般都需要设置超时时间。网上搜索,可以查询到通过设置http.Client中Transport的Dail函数,在自定义的Dail函数里面设置建立连接超时时长和发送接收...
golang提供的http get、post请求是没有设置超时的,但实现生产环境一般都需要设置超时时间。
网上搜索,可以查询到通过设置http.Client中Transport的Dail函数,在自定义的Dail函数里面设置建立连接超时时长和发送接收数据超时:
c?:=?http.Client{
? ? ? ??Transport:?&http.Transport{
? ? ? ? ? ??Dial:?func(netw, addr string) (net.Conn, error) {
? ? ? ? ? ? ? ? c, err?:=?net.DialTimeout(netw, addr, time.Second*3) //设置建立连接超时
? ? ? ? ? ? ? ??if?err?!=?nil {
? ? ? ? ? ? ? ? ? ??return?nil, err
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? c.SetDeadline(time.Now().Add(5?*?time.Second)) //设置发送接收数据超时
? ? ? ? ? ? ? ??return?c, nil
? ? ? ? ? ? },
? ? ? ? },
? ? }
因为上面的代码中调用SetDeadline设置了绝对过期时间,这会导致在该连接上发生的第二次及后来的请求的超时与预期的不一致。第一次请求的发送接收数据超时是5s,但第二次请求的发送接收数据超时是5s减去第一次请求发送接收数据耗时(忽略其他轻微耗时),后面的请求以此类推。所以,这种方法只适用于所有的请求都有各自的http.Client,也就是说每次请求都需要创建各自的http.Client,建立各自的连接。
但golang官方文档里面有说“Clients should be reused instead of created as needed. Clients are safe for concurrent use by multiple goroutines.”(详见http包中Client的定义说明)。重复利用http.Client,可以考虑如下方法:
var c *http.Client = &http.Client{
?? ?Transport: &http.Transport{
?? ??? ?Dial: func(netw, addr string) (net.Conn, error) {
?? ??? ??? ?c, err := net.DialTimeout(netw, addr, time.Second*3)
?? ??? ??? ?if err != nil {
?? ??? ??? ??? ?fmt.Println("dail timeout", err)
?? ??? ??? ??? ?return nil, err
?? ??? ??? ?}
?? ??? ??? ?return c, nil
?? ??? ?},
?? ??? ?MaxIdleConnsPerHost:?? 10,
?? ??? ?ResponseHeaderTimeout: time.Second * 2,
?? ?},
}
这里添加了ResponseHeaderTimeout配置,默认是0,无限等待。该设置不包括发送数据超时和接收返回包正文体超时,只能大致的实现发送接收数据超时设置。
说明:本文转载自[http超时设置 golang](https://studygolang.com/articles/93)
本文标题为:Golang http.Client设置超时
基础教程推荐
- swift中自定义正则表达式运算符=~详解 2023-07-06
- Swift实现表格视图单元格多选 2023-07-08
- 第02部分 Go开发学习 第3章 计算机组成原理快速扫盲 2023-09-05
- 用汇编语言实现从1加到100的方法(1+2+...+100) 2023-07-06
- 汇编实现的memcpy和memset的方法 2023-07-06
- R语言学习ggplot2绘制统计图形包全面详解 2022-12-08
- 详解Golang中NewTimer计时器的底层实现原理 2023-07-25
- Swift使用表格组件实现单列表 2023-07-08
- R语言中corrplot标题居中及eps格式输出 2022-12-08
- R语言数据结构之矩阵、数组与数据框详解 2022-12-18
