Golang代理设置方法

在Golang中如何设置HTTP/HTTPS代理?我尝试了http.ProxyURL但没成功,请问正确的代理配置方法是什么?需要处理认证的情况该怎么实现?能否提供一个完整的代码示例?

2 回复

Golang设置代理有几种方式:

  1. 环境变量设置:
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=https://proxy.example.com:8080
  1. 代码中设置:
os.Setenv("HTTP_PROXY", "http://proxy:8080")
  1. 使用http.Client:
proxyURL, _ := url.Parse("http://proxy:8080")
client := &http.Client{
    Transport: &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    },
}

推荐使用环境变量方式,简单通用。

更多关于Golang代理设置方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中设置代理主要有以下几种方法,适用于HTTP/HTTPS请求或全局网络访问:

1. 使用标准库net/http设置代理

package main

import (
    "net/http"
    "net/url"
    "io/ioutil"
    "fmt"
)

func main() {
    // 设置代理地址
    proxyURL, _ := url.Parse("http://proxy-server:8080")
    
    // 创建Transport配置代理
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }
    
    // 创建HTTP客户端
    client := &http.Client{
        Transport: transport,
    }
    
    // 发送请求
    resp, err := client.Get("http://example.com")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

2. 支持认证的代理

// 如果代理需要用户名密码认证
proxyURL, _ := url.Parse("http://username:password@proxy-server:8080")
transport := &http.Transport{
    Proxy: http.ProxyURL(proxyURL),
}

3. 环境变量方式(全局代理)

在运行程序前设置环境变量:

export HTTP_PROXY=http://proxy-server:8080
export HTTPS_PROXY=http://proxy-server:8080
go run main.go

4. 使用golang.org/x/net/proxy支持SOCKS5代理

import (
    "golang.org/x/net/proxy"
    "net/http"
)

func main() {
    // 创建SOCKS5代理dialer
    dialer, err := proxy.SOCKS5("tcp", "socks5-server:1080", nil, proxy.Direct)
    if err != nil {
        panic(err)
    }
    
    transport := &http.Transport{
        Dial: dialer.Dial,
    }
    
    client := &http.Client{
        Transport: transport,
    }
    
    // 使用客户端发送请求...
}

注意事项:

  • 生产环境中建议处理代理连接错误
  • 考虑添加超时设置
  • 根据需要选择是否验证SSL证书

选择哪种方法取决于你的具体需求:单个请求使用自定义Transport,全局代理使用环境变量,SOCKS5代理使用专门的库。

回到顶部