golang 怎么判断一个http请求是是timeout的?

有什么方式判断是一个request是超时的

阅读 10.6k
3 个回答

不是很理解你的问题, go是作为服务端还是作为客户端呢, 如果是作为服务端, 没有办法判断, 因为请求超时表示请求就没打到server; go作为客户端发起http请求的话, 可以直接设置请求超时时间, 时间到没有得到响应就是超时了.

以下代码供你参考下

    uri := "http://www.google.com/"
    client := http.Client{
        Timeout: 3 * time.Second,
    }

    resp, err := client.Get(uri)
    if err != nil {
        if strings.Contains(err.Error(), "Client.Timeout exceeded") {
            fmt.Println("HTTP Get timeout")
        }
    }
    defer resp.Body.Close()
    ...

可以用如下代码,便于检测超时。

req, err := http.NewRequest("GET", url, nil)
if err != nil {
    // TODO:
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
isTimeout := func() bool {
    select {
    default:
        return false
    case <-ctx.Done():
        // 是否超时
        return errors.Is(ctx.Err(), context.DeadlineExceeded)
    }
}
req = req.WithContext(ctx)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    if isTimeout() {
        // TODO: 超时处理
    }
    return
}
defer resp.Body.Close()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题