HTTP请求是否会自动重试?

10

我正在使用Go语言将我的数据推送到Apache服务器。假设我的Apache服务器暂时停止,那么我的HTTP请求会自动重试吗?我正在使用这个语句。

resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return errors.Wrap(err, "http request error")
    }

我无法继续下去,因为我认为我的执行被卡在这里了。而且我一直收到这个错误。

2个回答

15

不,您需要实现自己的重试方法,这是一个基本示例,可以给您提供一些想法:

https://play.golang.org/p/_o5AgePDEXq

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    var (
        err      error
        response *http.Response
        retries  int = 3
    )
    for retries > 0 {
        response, err = http.Get("https://non-existent")
        // response, err = http.Get("https://google.com/robots.txt")
        if err != nil {
            log.Println(err)
            retries -= 1
        } else {
            break
        }
    }
    if response != nil {
        defer response.Body.Close()
        data, err := ioutil.ReadAll(response.Body)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("data = %s\n", data)
    }
}

如何在单元测试中模拟或测试这个? - RAVI BANGKIT NUR ZIKRILLAH
@RAVIBANGKITNURZIKRILLAH 你可以使用 httptest 包。 - Willian Andrade
这个是不是更好地在一个定制的运输方式中实施? - JamesHalsall

14

如果我想给一个请求设置一些超时时间,就像在默认的http.Client中所做的那样,该怎么办呢? tr := &http.Transport{ IdleConnTimeout: 30 * time.Second, } client := &http.Client{Transport: tr} 在这里,我们可以设置IdleConnTimeout,那么在go-retryablehttp中我们能否做到同样的事情呢? - yashjain12yj
你可以在Client.HTTPClient.Timeout上设置超时时间。 可查看https://godoc.org/github.com/hashicorp/go-retryablehttp#Client 获取更多参考。 - nishith
1
那个库不幸地没有处理客户端超时的情况,请参见:https://github.com/hashicorp/go-retryablehttp/issues/167 - fideloper
我可以确认,在撰写本文时,当前的实现没有处理(重试)客户端超时。 - Ninh Pham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接