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.使用方法
- 使用环境变量的代理,实际代理方式可以不是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内置功能了。
golang的http库使用代理的更多相关文章
- Golang实现requests库
Golang实现requests库 简单的封装下,方便使用,像python的requests库一样. Github地址 Github 支持 GET.POST.PUT.DELETE applicatio ...
- 4-urllib库添加代理,添加请求头格式 模板
urllib 库设置代理的方法 案例如下:
- Golang 的 TOML库
TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...
- 『Golang』—— 标准库之 os
Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...
- Golang编写动态库实现回调函数
Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...
- golang命令行库cobra的使用
简介 Cobra既是一个用来创建强大的现代CLI命令行的golang库,也是一个生成程序应用和命令行文件的程序.下面是Cobra使用的一个演示: Cobra提供的功能 简易的子命令行模式,如 app ...
- golang使用simplejson库解析复杂json
cnblogs原创 golang自带的json解析库encoding/json提供了json字符串到json对象的相互转换,在json字符串比较简单的情况下还是挺好用的,但是当json字符串比较复杂或 ...
- golang调用动态库
测试动态库 test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" int test_so_ ...
- window下golang生成静态库给C语言调用
buidmod为c-archive能在window下生成 ,c-shared则不行 1.golang生成c-archive静态库 main.go package main import "C ...
随机推荐
- 实践案例丨基于 Raft 协议的分布式数据库系统应用
摘要:简单介绍Raft协议的原理.以及存储节点(Pinetree)如何应用 Raft实现复制的一些工程实践经验. 1.引言 在华为分布式数据库的工程实践过程中,我们实现了一个计算存储分离. 底层存储基 ...
- Appium之启动第一个App
搭建appium自动化环境真是各种问题呀. 如何启动在真机上启动App? 执行操作:操作Android真机上打开手机淘宝app,并搜索“熊猫”. 脚本源码如下: from appium import ...
- oracle之二控制文件
控制文件 3.1 控制文件的功能和特点: 1)定义数据库当前物理状态,不断在往controlfile写入[SCN等] 2)维护数据的一致性 3)是一个二进制文件 ...
- 总结SUMMARY
Summary 多线程 多线程 pthread NSThread 创建线程的方式 NSThread 的 Target 线程状态 线程属性 资源共享 原子属性 线程间通讯 GCD 同步 & 异步 ...
- [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的 ...
- Linux内存子系统——Locking Pages(内存锁定)
该部分内容可以参考libc man page 3.5 LockingPages 概述 你可以让系统将特定的虚拟内存页与实际页帧相"关联",并保持这样的状态(称为锁定).该部分内存不 ...
- rocketmq配置文件参数(broker-xx.properties)
#broker集群名称,用于划分broker brokerClusterName=MQCluster001 #broker名称,用于主从配对,相同名称的broker才能做主从设置 brokerName ...
- k8s数据管理(八)
volume 我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可以使用 ...
- 8.ExecutorService-执行器服务
- 【思维】The Four Dimensions of Thinking :长线思维的力量
"经历过这些苦难之后,我拥抱了一种新的人生哲学,就是更多地关注在那些长期可以获得复利的小收获上,而不是那种频繁的短跑冲刺和精力消耗". 斯坦福教授,著名的心理学家Philip Zi ...