GO 请求一个URL如何指定IP?

meiruhua · 2022-08-25 14:00:36 · 3095 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-08-25 14:00:36 的主题,其中的信息可能已经有所发展或是发生改变。

比如要请求一个 域名 A.COM ,希望DNS指定解析到IP 1.1.1.1,如何设置http.Client呢? *不能本地改HOST那种方式


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3095 次点击  ∙  1 赞  
加入收藏 微博
7 回复  |  直到 2022-09-01 15:43:16
mingliangge
mingliangge · #1 · 3年之前

域名服务商添加一条解析记录不就行了?

meiruhua
meiruhua · #2 · 3年之前

1楼 @mingliangge 大哥,实际情况需求就是这样,对方提供个域名,访问的时候请求方需指定对应IP,这些都是内部对接接口,不对外所以没有解析,银行内部接口都是这些玩意。

mingliangge
mingliangge · #3 · 3年之前
meiruhuameiruhua #2 回复

1楼 @mingliangge 大哥,实际情况需求就是这样,对方提供个域名,访问的时候请求方需指定对应IP,这些都是内部对接接口,不对外所以没有解析,银行内部接口都是这些玩意。

zzustu
zzustu · #4 · 3年之前

内部接口,你又知道 IP,是不是对方的 HTTP 服务绑定了 Host,那这样的话客户端指定下 Host 就行了:

req, _ := http.NewRequest(http.MethodGet, "http://127.0.0.1:8080", nil)
req.Host = "a.com"
http.DefaultClient.Do(req)
jan-bar
jan-bar · #5 · 3年之前

研究一下go解析DNS的接口,重新实现连接服务器的方法,在里面做你这个特殊判断吧,参考下面代码就行。

package main

import (
    "context"
    "net"
    "net/http"
)

func init() {
    net.DefaultResolver = &net.Resolver{
        Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
            if address == "a.com" {
                address = "1.1.1.1"
            }
            var d net.Dialer
            return d.DialContext(ctx, network, address)
        },
    }
}

func main() {
    http.Get("https://a.com") // 使用全局DNS解析的连接

    c := &http.Client{
        Transport: &http.Transport{
            DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
                if addr == "a.com" {
                    addr = "1.1.1.1" // 自定义当前http.Client的连接
                }
                var d net.Dialer
                return d.DialContext(ctx, network, addr)
            },
        },
    }
    c.Get("https://a.com")
}
meiruhua
meiruhua · #6 · 3年之前
zzustuzzustu #4 回复

内部接口,你又知道 IP,是不是对方的 HTTP 服务绑定了 Host,那这样的话客户端指定下 Host 就行了: ```go req, _ := http.NewRequest(http.MethodGet, "http://127.0.0.1:8080", nil) req.Host = "a.com" http.DefaultClient.Do(req) ```

这个可以了,非常感谢!

fginter
fginter · #7 · 3年之前
meiruhuameiruhua #6 回复

#4楼 @zzustu 这个可以了,非常感谢!

这招貌似对HTTPS无效。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传