欲买桂花同载酒,荒泷天下第一斗。|

janbar

园龄:4年6个月 粉丝:29 关注:10

📂golang
2020-01-15 11:44 阅读 291 评论 0 推荐 0

golang的http库使用代理

1.先上代码

copy
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 @   janbar  阅读(291)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~

FAVOURITE

点击右上角即可分享
微信分享提示
*✧⁺˚⁺ପ(๑・ω・)੭ु⁾⁾ 好好学习天天向上
进入亮色模式
(*╹▽╹*)土豪我们做朋友好不好
(*╹▽╹*)土豪我们做朋友好不好

FAVOURITE