正确的 http 代理使用姿势
proxy, _ := url.Parse("http://127.0.0.1:1081") clt := http.Client{ Timeout: 5 * time.Second, Transport: &http.Transport{ Proxy: http.ProxyURL(proxy), // 使用代理请求 TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 跳过 https 证书资格验证 }, } resp, err := clt.Get(fmt.Sprintf("http://www.google.com/ping?sitemap=%s", sitemapUrl))
go http 提供了 2 个函数:
// 使用环境变量: HTTP_PROXY,HTTPS_PROXY func ProxyFromEnvironment(req *Request) (*url.URL, error) // 指定端口 func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)
http 代理直接使用 http 包即可完成,不过 socks5 就得用: golang.org/x/net/proxy
package main import ( "crypto/tls" "fmt" "golang.org/x/net/proxy" "io/ioutil" "log" "net/http" "time" ) func main() { dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, proxy.Direct) if err != nil { log.Fatalf("socks5 init err: %s", err.Error()) return } clt := http.Client{ Timeout: 5 * time.Second, Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, Dial: dialer.Dial, }, } resp, err := clt.Get("https://www.google.com") if err != nil { log.Fatalf("ping google sitemap err: %s", err.Error()) return } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { log.Fatalf("curl google failed~") return } body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf("google response body read err: %s", err.Error()) } fmt.Println(string(body)) return }
结果是可以正常返回的,服务器是在北京的。
![]() | 1 douyacun OP 我是因为博客接了 Github 登录(京东云,因为便宜)大部分情况都是超时的,当时的做法是租一个阿里云香港的服务器( 25),然后 go 写了一套的代理来访问, 只做这一件事情有点奢侈~,毕竟有其他的 ss |