golang的http庫使用代理


1.先上代碼

package main

import (
	"crypto/tls"
	"flag"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func main() {
	u := flag.String("u", "http://www.baidu.com", "get url")
	p := flag.String("p", "http://127.0.0.1:1081", "proxy string")
	flag.Parse()

	err := useProxyFromEnvironment(*u)
	if err != nil {
		fmt.Println(err)
		return
	}

	err = useProxyURL(*u, *p)
	if err != nil {
		fmt.Println(err)
		return
	}
}

func useProxyFromEnvironment(u string) error {
	req, err := http.NewRequest(http.MethodGet, u, nil)
	if err != nil {
		return err
	}
	r, err := (&http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				InsecureSkipVerify: true,
			}, // 使用環境變量的代理
			Proxy: http.ProxyFromEnvironment,
		}}).Do(req)
	if err != nil {
		return err
	}
	if r != nil {
		defer r.Body.Close()
	}
	b, err := ioutil.ReadAll(r.Body)
	if err != nil {
		return err
	}
	fmt.Println("useProxyFromEnvironment:", string(b))
	return nil
}

func useProxyURL(u, proxy string) error {
	req, err := http.NewRequest(http.MethodGet, u, nil)
	if err != nil {
		return err
	}
	tr := &http.Transport{TLSClientConfig: &tls.Config{
		InsecureSkipVerify: true,
	}}
	if proxy != "" {
		proxyUrl, err := url.Parse(proxy)
		if err == nil { // 使用傳入代理
			tr.Proxy = http.ProxyURL(proxyUrl)
		}
	}
	r, err := (&http.Client{Transport: tr}).Do(req)
	if err != nil {
		return err
	}
	if r != nil {
		defer r.Body.Close()
	}
	b, err := ioutil.ReadAll(r.Body)
	if err != nil {
		return err
	}
	fmt.Println("useProxyURL:", string(b))
	return nil
}

2.使用方法

  1. 使用環境變量的代理,實際代理方式可以不是http:
    HTTP_PROXY=http:/127.0.0.1:1081 ./proxy -u http://www.baidu.com
    http_proxy=http:/127.0.0.1:1081 ./proxy -u http://www.baidu.com
    HTTPS_PROXY=http:/127.0.0.1:1081 ./proxy -u http://www.baidu.com
    https_proxy=http:/127.0.0.1:1081 ./proxy -u http://www.baidu.com
    下面就是用socks5代理
    http_proxy=socks5:/127.0.0.1:1081 ./proxy -u http://www.baidu.com
    不使用代理可以,NO_PROXY可以傳以","逗號分隔的IP或域名,表示這些不用代理
    NO_PROXY=* ./proxy -u http://www.baidu.com
    上述三種環境變量可以同時使用,組合起來效果更佳
    2.使用參數指定代理
    ./proxy -u http://www.baidu.com -p http:/127.0.0.1:1081
    ./proxy -u http://www.baidu.com -p socks5:/127.0.0.1:1081
    這種方式是代碼指定代理,因此代理規則需要自己設計不像上面環境變量已經是go內置功能了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM