首页  >  文章  >  后端开发  >  在 Go 中发出 HTTP GET 请求时出错:“dial tcp:lookup api.ipify.org on:53:read udp:50975->:53:read:connectionrejected”

在 Go 中发出 HTTP GET 请求时出错:“dial tcp:lookup api.ipify.org on:53:read udp:50975->:53:read:connectionrejected”

王林
王林转载
2024-02-10 11:57:211222浏览

在 Go 中发出 HTTP GET 请求时出错:“dial tcp:lookup api.ipify.org on:53:read udp:50975->:53:read:connectionrejected”

在Go语言中,当我们尝试发送HTTP GET请求时,有时会遇到名为“dial tcp: lookup api.ipify.org on: 53: read udp: 50975->: 53: read: connection rejected”的错误。这个错误通常出现在网络连接方面,它表示我们的程序无法建立与目标服务器的连接。这个错误的原因可能有很多,如网络故障、DNS解析问题或防火墙限制等。解决这个问题的方法取决于具体情况,我们可以尝试检查网络设置、验证DNS解析是否正确、排除防火墙限制等。通过解决这个错误,我们可以确保我们的Go程序能够正常地发送HTTP请求并获取所需的数据。

问题内容

我正在尝试使用 net/http 包在 Go 中发出 HTTP GET 请求,以使用 api.ipify.org 服务检索我的公共 IP 地址。仅在使用以下命令构建应用程序后,我才遇到错误:

CGO_ENABLED=0 GOOS=linux go build -a -ldflags "-s -w" -o ip get.go

但是,我注意到当我使用以下命令时,代码运行得非常好:

go build get.go
go run get.go

这是我正在使用的代码:

package main

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

func get() {
    resp, err := http.Get("https://api.ipify.org")
    if err == nil {
        defer resp.Body.Close()
        bodyBytes, _ := ioutil.ReadAll(resp.Body)
        body := string(bodyBytes)
        fmt.Println(body)
    } else {
        fmt.Println(err)
    }
}

func main() {
    get()
}

令我困惑的是,为什么代码可以与 go buildgo run 一起使用,但当我使用更复杂的构建命令时却失败。有人可以帮助我了解可能导致此问题的原因以及如何解决它吗?感谢您的时间和帮助!

解决方法

当 cgo 可用时,将使用基于 cgo 的解析器。它使用各种方式来解析正在读取 /etc/resolv.conf 或 /etc/nsswitch.conf 等的域。这些功能不是由基于 Go 的 DNS 解析器实现的,因此导致无法解析域和 HTTP 请求失败。

以上是在 Go 中发出 HTTP GET 请求时出错:“dial tcp:lookup api.ipify.org on:53:read udp:50975->:53:read:connectionrejected”的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除