Golang http.Client设置超时

本文探讨了Golang标准库中http.Get和http.Post方法默认未设置超时的问题,并提供了两种设置HTTP请求超时的解决方案。第一种是通过自定义Dial函数在http.Client中设置连接和数据传输的超时,但这种方法可能导致后续请求的超时时间不准确。第二种方法是使用http.Client的ResponseHeaderTimeout字段,但这仅能设置响应头的超时,不包括正文数据的接收。文章建议在生产环境中根据需求选择合适的方法来设置HTTP请求的超时。

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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值