在域中按域名查找IP地址

问题描述

我正在使用以下代码编写API,以查找给定域的IP地址:

func IPFinder(c *gin.Context) {
    var domain models.Domain
    c.BindJSON(&domain)
    addr,err := net.LookupIP(domain.DomainName)
    if err != nil {
        c.JSON(http.StatusBadRequest,gin.H{"error": err.Error()})
    } else {
        c.JSON(http.StatusOK,gin.H{"ip_address": addr})
    }
    return
}

对于以下请求:

{
    "domain_name": "google.com"
}

得到的响应为:

{
    "ip_address": [
        "2404:6800:4002:80a::200e","172.217.167.46"
    ]
}

此处,此LookupIP方法提供了包含该域的ipv4和ipv6地址的切片。 GoLang中是否还有其他任何第三方库的其他方式,使用该方式我可以得到仅包含如下IP地址的输出:

{
    "ip_address": "172.217.167.46"
}

解决方法

如果您仅对IPv4地址感兴趣,则可以这样获得它:

package main

import (
    "fmt"
    "net"
)

func main(){
    ips,_ := net.LookupIP("google.com")
    for _,ip := range ips {
        if ipv4 := ip.To4(); ipv4 != nil {
            fmt.Println("IPv4: ",ipv4)
        }
    }
}
,

您可以使用cloudflare-dns.com上的DNS-over-HTTPS服务,请参阅here

package main

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

type DnsJson struct {
    Status   int  `json:"Status"`
    TC       bool `json:"TC"`
    RD       bool `json:"RD"`
    RA       bool `json:"RA"`
    AD       bool `json:"AD"`
    CD       bool `json:"CD"`
    Question []struct {
        Name string `json:"name"`
        Type int    `json:"type"`
    } `json:"Question"`
    Answer []struct {
        Name string `json:"name"`
        Type int    `json:"type"`
        TTL  int    `json:"TTL"`
        Data string `json:"data"`
    } `json:"Answer"`
}

func main() {

    req,err := http.NewRequest("GET","https://cloudflare-dns.com/dns-query",nil)
    if err != nil {
        log.Fatal(err)
    }

    q := req.URL.Query()
    q.Add("ct","application/dns-json")
    q.Add("name","cloudflare.com") // Insert here your domain

    req.URL.RawQuery = q.Encode()

    client := &http.Client{}

    if err != nil {
        log.Fatal(err)
    }
    res,err := client.Do(req)
    defer res.Body.Close()
    body,err := ioutil.ReadAll(res.Body)

    var dnsResult DnsJson
    if err := json.Unmarshal(body,&dnsResult); err != nil {
        log.Fatal(err)
    }

    for _,dnsAnswer := range dnsResult.Answer {
        fmt.Println("IP:",dnsAnswer.Data)
    }

    // Output
    // IP: 104.17.175.85
    // IP: 104.17.176.85
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...