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 ...
随机推荐
- leetcode刷题-77组合
题目 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3 ...
- leetcode刷题-74搜索二维矩阵
题目 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列.每行的第一个整数大于前一行的最后一个整数.示例 1: 输入:matrix ...
- vue3剖析:响应式原理——effect
响应式原理 源码目录:https://github.com/vuejs/vue-next/tree/master/packages/reactivity 模块 ref: reactive: compu ...
- sql注入--bool盲注,时间盲注
盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...
- [LeetCode]33. 搜索旋转排序数组(二分)
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目 ...
- Linux中逻辑卷(LV)的创建、增大和减小
首先说一下在缩小逻辑卷的时候要注意的问题:第一步使用resize2fs命令更改文件系统的容量:第二步使用lvreduce命令减小逻辑卷的容量.这两个顺序千万不要搞反了,而且要保证缩减后的逻辑卷容量大于 ...
- Linux安装软件总结
1.安装jdk1.8 1.首先去官网下载jdk https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...
- windows服务器添加磁盘后,提示The disk is offline because of policy set by an administrator的解决办法
操作系统:Windows Server 2008 R2 Enterprise 事件:存储在虚拟机上添加三块磁盘,笔者准备扩展到E盘(动态分区) 问题:存储团队添加磁盘后,OS的磁盘管理界面,看到提示, ...
- phpStudy8.1.0.1配置子域名多网站
版本 这里phpStudy版本为8.1.0.1: 步骤 假设域名为:domain.com:公网IP地址为:42.33.33.33 首先云解析中配置,添加子域名A记录直接指向你的公网IP: ep.dom ...
- Processing 网格纹理制作(棋盘格)
写在前面的话 很久没有写博文了.最近在整理Processing有关文档,看到之前做的一些例子,想着分享在互联网上,当然和以前一样,目前也仅为了给初学者有个学习参考,笔者能力有限.废话不多说,干就完事了 ...