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 ...
随机推荐
- centOS7 设置mysql数据库外网可以访问
1.查看目前防火墙是否对外开发了3306端口 firewall-cmd --list-all 2.查看3306端口是否开放 firewall-cmd --query-port=3306/tcp no ...
- leetcode刷题-94二叉树的中序遍历
题目 给定一个二叉树,返回它的中序 遍历. 实现 # def __init__(self, x): # self.val = x # self.left = None # self.right = N ...
- graph attention network(ICLR2018)官方代码详解(tensorflow)-稀疏矩阵版
论文地址:https://arxiv.org/abs/1710.10903 代码地址: https://github.com/Diego999/pyGAT 之前非稀疏矩阵版的解读:https://ww ...
- pycharm写的代码提交到git上,提示需要merge失败时解决办法
当遇到pycharm代码提交需要合并报错时 原因:pycharm目录和git中目录冲突了 解决办法:1.先在git仓库中创建一个文件夹,比如day1 2.然后在pycharm中update一下,可以看 ...
- Web_php_unserialize 攻防世界
1.$var输入处有一个正则过滤 2._wakeup处需要过滤 编写脚本如下 后在网页输入?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4Oi ...
- in多值优化
〇.问题 今天ocp群里有人问 SELECT * FROM table WHERE id IN(11,2,3,44,...) 在in里面有大量数据4000+,有什么 好的处理方式吗? 我的优化方案的总 ...
- 解决IDEA打包出现中文乱码的问题
这主要是maven编译时编码问题导致的. 解决办法: 1.在IDEA的File里面打开Settings. 2.找到Runner,在VM Options输入-DarchetypeCatalog=inte ...
- 关于MongoDB
启动: 启动MongoDB的方式有两种: 1.直接启动,配置参数写在命令中: mongod --dbpath=data/db --logpath=log/log.txt --fork 2.以配置文件启 ...
- Java新特性:数据类型可以扔掉了?
在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些: 枚举:尽管在 JDK 5 中增加了枚举类型,但是 Class 文件常量池的 CONSTANT_Class_info 类型常量并没 ...
- 方法区(Method Area)基础知识
堆.栈.方法区堆关系 概述 方法区与堆区一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的 方法区的大小,跟堆空间一样,可以 ...