http请求是否会自动重试?

时间:2018-06-04 08:57:24

标签: http go

我正在尝试使用GoLang将数据推送到apache服务器。假设我的apache服务器暂时停止。然后我的http请求会自动重试。 我正在使用这个声明

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

我无法继续进行,因为我的执行被困在这里。我一再得到这个错误。

2 个答案:

答案 0 :(得分:3)

不,你需要实现自己的重试方法,这是一个可以给你一个想法的基本例子:

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)
    }
}

答案 1 :(得分:3)

您可以通过使用retryablehttp使用更干净的重试实现 https://github.com/hashicorp/go-retryablehttp可处理大多数情况
这为重试策略,退避等提供自定义。