You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何绕过代理直接发起HTTP请求并检查响应码?

解决Go语言中绕过代理请求的问题

你遇到的问题其实很常见:直接用os.Setenv清空HTTP_PROXY和HTTPS_PROXY后,http.Get还是会走之前的代理配置。这是因为Go的http.DefaultClient使用的默认Transport是在程序启动时就初始化完成的,它已经读取了当时的环境变量,后续修改环境变量不会更新这个已经存在的Transport的代理设置。

要真正绕过代理,你需要创建一个自定义的http.Transport,明确禁用代理,然后基于这个Transport创建自己的http.Client来发起请求。下面是具体的实现代码:

package main

import (
    "fmt"
    "log"
    "net/http"
    "strconv"
)

func main() {
    // 创建一个禁用代理的Transport
    transport := &http.Transport{
        Proxy: nil, // 明确设置为nil,完全禁用代理
    }

    // 使用自定义Transport创建Client
    client := &http.Client{
        Transport: transport,
    }

    // 发起请求
    resp, err := client.Get("http://internalIP:80")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close() // 别忘了关闭响应体,避免资源泄漏

    fmt.Println("HTTP Response Code : " + strconv.Itoa(resp.StatusCode))
    if resp.StatusCode != 200 {
        fmt.Println("Not OK")
    } else {
        fmt.Println("HTTP OK")
    }
}

另外,如果你只是临时需要对某一个请求绕过代理,也可以直接修改默认Transport的Proxy设置,但注意这是全局的,会影响所有使用http.DefaultClient的请求:

// 全局修改默认Transport的代理设置
http.DefaultTransport.(*http.Transport).Proxy = nil

// 之后用http.Get发起请求就会绕过代理
resp, err := http.Get("http://internalIP:80")
// ... 后续处理代码

需要注意的是,第二种方式因为修改了全局的默认Transport,所以如果你的程序中有其他地方也使用http.DefaultClient,它们的代理行为也会被改变,所以第一种创建自定义Client的方式更安全,适合局部需求。

内容的提问来源于stack exchange,提问作者Theroth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:38:33