在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)

71 阅读2分钟

不用担心,掌握在一些Go的基础类库如net和httptrace,我们就可以实现获取某个域名的IP地址。

大家知道,在网络中,我们通常用域名比如www.google.com来访问一个网站,而背后实际上我们的电脑是和这个域名对应的IP地址相对应的。如果你想知道一个域名对应的IP地址,我们可以借助Go的net库进行获取。

想象一下,我们是在一条复杂的地下隧道网中,这个隧道网就是互联网,每个站点就是一个IP。向一个特定的域名发送请求,就像是在隧道中穿越到达一个地点,而httptrace库就像是我们的导航设备,帮我们追踪我们的路由路径。

下面就是一个简单的例子,假装我们就是一个探险家,我们的目的地是google.com,我们要追踪我们的路程,并且找出这个域名实际对应的IP地址:

package main

import (
	"fmt"
	"net"
	"net/http"
	"net/http/httptrace"
)

func main() {
	req, _ := http.NewRequest("GET", "http://www.google.com", nil)

	trace := &httptrace.ClientTrace{
		ConnectStart: func(network, addr string) {
			fmt.Printf("开始连接: %v\n", addr)
		},
		ConnectDone: func(network, addr string, err error) {
			if err == nil {
				fmt.Printf("连接成功: %v\n", addr)
			}
		},
	}
	req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))

	_, err := http.DefaultTransport.RoundTrip(req)
	if err != nil {
		fmt.Println("请求错误: ", err)
		return
	}

	ipaddr, err := net.LookupIP("www.google.com")
	if err != nil {
		fmt.Println("获取IP地址错误: ", err)
		return
	}

	for _, ip := range ipaddr {
		fmt.Println("获取到的IP地址: ", ip)
	}
}
​

上述代码中,关键的步骤包括:

  1. 创建一个新的http请求;
  2. 创建一个新的httptrace.ClientTrace结构体,并配置ConnectStart和ConnectDone两个回调函数。当连接开始和完成时,这些函数将被调用,其中addr参数就是目标地址,包括IP和端口;
  3. 将我们的http请求与我们的trace关联;
  4. 使用http.DefaultTransport.RoundTrip发送我们的请求;
  5. 使用net.LookupIP函数通过域名来查询IP地址。

注意:以上代码并不能真正发送http请求,而是在导航设备建立连接时结束。因此,不必担心它将消耗大量网络流量。

这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!