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
相关产品推荐
相关产品推荐

