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刷题-64最小路径和
题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入:[ [1,3,1], [1,5, ...
- JQuery的Ajax实现注册检测用户名
Ajax(无需等待直接向服务器发起请求) (Asynchronous Javascript And Xml) :异步的 Google创新的一种js技术 实现方法一:比较原始没有封装的方法: //核对用 ...
- Java的枚举简单应用
/** * 请用枚举方式实现如下应用: * 客户去旅店住房, * 客户分普通客户,和vip客户,vip分白金和钻石客户 * 不同的客户有不同的折扣 * 入住的房间分单人房,双人房和套房 * 不同的房间 ...
- memcached缓存:安装和清缓存
一.安装步骤: 1.将工具一直解压,解压到最底层的exe目录
- 恭喜!Apache Hudi社区新晋多位Committer
1. 介绍 经过Apache Hudi项目委员会讨论及投票,向Udit Mehrotra.Gary Li.Raymond Xu.Pratyaksh Sharma 4人发出Committer邀请,4人均 ...
- 小程序开发-iView Weapp微信小程序UI组件库入门使用
iView Weapp UI组件库 今天来试试iView Weapp 这个微信小程序组件库,看看好不好用~~ 官网地址: http://inmap.talkingdata.com/wx/index_p ...
- 【二叉树-BFS系列1】二叉树的右视图、二叉树的锯齿形层次遍历
题目 199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, ...
- node 进阶 | 通过node中如何捕获异常阐述express的特点
node如何捕获异常 node基于js的单线程,有了非阻塞异步回调的概念,但是在处理多个并发连接时,并发环境要求高,最重要的是单线程,单核CPU,一个进程crash则web服务都crash,但是为什么 ...
- 从CSDN博客下载的图片如何无损去水印
如果你想下载别人CSDN博客文章中很好看的图片,但却有水印 想要下载去水印的图片,可以先鼠标右击该图片,选择复制图片地址 https://img-blog.csdnimg.cn/20200916140 ...
- 阿里云docker部署mysql
看完我的上一个博客之后,对centos系统应该有一定的了解,话不多说,接下来我们来在docker容器中部署mysql. 1.下载mysql镜像,因为本人用的5.7版本,你也可以下载最新版,都是可以的 ...