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内置功能了。
posted @ 2020-01-15 11:44  janbar  阅读(289)  评论(0编辑  收藏  举报