首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Golang中设置http.Get()请求的超时时间?

如何在Golang中设置http.Get()请求的超时时间?
EN

Stack Overflow用户
提问于 2013-06-03 19:06:41
回答 6查看 119.1K关注 0票数 138

我在Go中做了一个URL抓取器,并且有一个要抓取的URL列表。我向每个URL发送http.Get()请求并获得它们的响应。

代码语言:javascript
运行
复制
resp,fetch_err := http.Get(url)

如何为每个Get请求设置自定义超时?(默认时间非常长,这使得我的抓取器非常慢。)我希望我的抓取器有一个大约40-45秒的超时,在此之后它应该返回“请求超时”并移动到下一个URL。

我如何才能做到这一点?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-08-17 06:10:18

显然,在Go 1.3中,http.Client有超时字段

代码语言:javascript
运行
复制
client := http.Client{
    Timeout: 5 * time.Second,
}
client.Get(url)

这对我来说是个好把戏。

票数 309
EN

Stack Overflow用户

发布于 2013-06-05 10:33:38

为了补充Volker的回答,如果除了连接超时之外,您还想设置读/写超时,您可以执行如下操作

代码语言:javascript
运行
复制
package httpclient

import (
    "net"
    "net/http"
    "time"
)

func TimeoutDialer(cTimeout time.Duration, rwTimeout time.Duration) func(net, addr string) (c net.Conn, err error) {
    return func(netw, addr string) (net.Conn, error) {
        conn, err := net.DialTimeout(netw, addr, cTimeout)
        if err != nil {
            return nil, err
        }
        conn.SetDeadline(time.Now().Add(rwTimeout))
        return conn, nil
    }
}

func NewTimeoutClient(connectTimeout time.Duration, readWriteTimeout time.Duration) *http.Client {

    return &http.Client{
        Transport: &http.Transport{
            Dial: TimeoutDialer(connectTimeout, readWriteTimeout),
        },
    }
}

这段代码已经过测试,并在生产环境中运行。有关测试的完整要点可在此处https://gist.github.com/dmichael/5710968获得

请注意,您将需要为每个请求创建一个新的客户端,因为conn.SetDeadline引用了来自time.Now()的未来点

票数 34
EN

Stack Overflow用户

发布于 2018-08-28 05:41:47

如果您想对每个请求执行此操作,为简洁起见,请忽略错误处理:

代码语言:javascript
运行
复制
ctx, cncl := context.WithTimeout(context.Background(), time.Second*3)
defer cncl()

req, _ := http.NewRequestWithContext(ctx, http.MethodGet, "https://google.com", nil)

resp, _ := http.DefaultClient.Do(req)
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16895294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档