使用 HTTP GET 请求拨打 tcp i/o 超时

问题描述

遇到一些错误,我一定是忽略了一些东西。 我该如何调试?断开连接?

我阅读了以下内容
golang - Why net.DialTimeout get timeout half of the time?
Go. Get error i/o timeout in server program
golang get massive read tcp ip:port i/o timeout in ubuntu 14.04 LTS
Locating the "read tcp" error in the Go source code
Getting sporadic "http: proxy error: read tcp: i/o timeout" on Heroku

此处创建的错误https://github.com/golang/go/blob/b115207baf6c2decc3820ada4574ef4e5ad940ec/src/net/net.go#L179

目标: 向 url 发送 Get 请求。
预期结果: 以 JSON 格式返回正文。
遇到的问题: 输入输出超时

它适用于 Postman
编辑: 我添加修改后的超时...

Edit2:跟踪错误

邮递员请求:

GET /v2/XRP-EUR/candles?interval=1h HTTP/1.1
Host: api.bitvavo.com

邮递员结果(1440 行):

[
    [
        1609632000000,"0.17795","0.17541","0.17592","199399.874013"
    ],[
        1609628400000,"0.17937","0.18006","0.17622","0.17852","599402.631894"
    ],[
        1609624800000,"0.18167","0.17724","0.17984","579217.962574"
    ],.....

代码

package main

import (
    "fmt"
    "net/http"
    "io/IoUtil"
    "time"
)

func main() {
    url := "https://api.bitvavo.com/v2/XRP-EUR/candles?interval=1h"
    method := "GET"

    client := &http.Client {
    }
    client.Timeout = time.Second * 60
    req,err := http.NewRequest(method,url,nil)

    if err != nil {
        fmt.Println(err)
        return
    }
    res,err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()

    body,err := IoUtil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(body))
}

结果:

Get "https://api.bitvavo.com/v2/XRP-EUR/candles?interval=1h": dial tcp 65.9.73.10:443: I/O timeout

解决方法

本地环境,防火墙不允许golang拨号tcp..
它仍然允许将 url 解析为 ip (DNS)

,

我在 docker 容器中构建时遇到了这个问题。

不知道为什么,但是在 docker swarm leave --forcesystemctl restart docker 之后构建成功了。