前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >http超时设置 golang

http超时设置 golang

作者头像
李海彬
发布2018-03-20 15:07:57
3.5K0
发布2018-03-20 15:07:57
举报
文章被收录于专栏:Golang语言社区

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,无限等待。该设置不包括发送数据超时和接收返回包正文体超时,只能大致的实现发送接收数据超时设置。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档