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.使用方法

  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内置功能了。

golang的http库使用代理的更多相关文章

  1. Golang实现requests库

    Golang实现requests库 简单的封装下,方便使用,像python的requests库一样. Github地址 Github 支持 GET.POST.PUT.DELETE applicatio ...

  2. 4-urllib库添加代理,添加请求头格式 模板

    urllib 库设置代理的方法 案例如下:

  3. Golang 的 TOML库

    TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...

  4. 『Golang』—— 标准库之 os

    Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...

  5. Golang编写动态库实现回调函数

    Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...

  6. golang命令行库cobra的使用

    简介 Cobra既是一个用来创建强大的现代CLI命令行的golang库,也是一个生成程序应用和命令行文件的程序.下面是Cobra使用的一个演示: Cobra提供的功能 简易的子命令行模式,如 app ...

  7. golang使用simplejson库解析复杂json

    cnblogs原创 golang自带的json解析库encoding/json提供了json字符串到json对象的相互转换,在json字符串比较简单的情况下还是挺好用的,但是当json字符串比较复杂或 ...

  8. golang调用动态库

    测试动态库 test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" int test_so_ ...

  9. window下golang生成静态库给C语言调用

    buidmod为c-archive能在window下生成 ,c-shared则不行 1.golang生成c-archive静态库 main.go package main import "C ...

随机推荐

  1. layui表单引入ueditor遇坑记

    1. 错误示例:表单容器是div标签则无法获取ueditor的内容 注:对于普通的表单元素表单容器是div也都能获取 <!DOCTYPE html> <html> <he ...

  2. 设计模式也可以这么简单(7年开发老鸟PS注释总结)

    设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four (GoF) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分 ...

  3. [04] C# Alloc Free编程之实践

    C# Alloc Free编程之实践 上一篇说了Alloc Free编程的基本理论. 这篇文章就说怎么具体做实践. 常识 之所以说是常识, 那是因为我们在学任何一门语言的时候, 都能在各种书上看到各种 ...

  4. [LeetCode]Sql系列

    题目1 Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id. +----+-------+--------+--------------+ ...

  5. Java中的lambda匿名函数使用

    Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...

  6. 我告诉你一个 AtomicInteger 的惊天大秘密

    i++ 不是线程安全的操作,因为它不是一个原子性操作. 那么,如果我想要达到类似 i++ 的这种效果,我应该使用哪些集合或者说工具类呢? 在 JDK1.5 之前,为了确保在多线程下对某基本数据类型或者 ...

  7. day54:django:锁和事务&Ajax&中间件Middleware

    目录 1.ORM中的锁和事务 2.Ajax 3.中间件:Middleware 3.1 什么是中间件? 3.2 django请求的生命周期 3.3 中间件可以定义的5个方法 3.4 自定义中间件的流程 ...

  8. .net core中的那些常用的日志框架(Logging篇)

    前言 日志,在我们每个项目中是必不可少的,它不仅能在调试的时候测试数据,而且在项目上线,也是我们排查错误的得力助手,那我就能谈谈,用的多的几个日志框架吧!如果有不对的地方,欢迎来指教错误,谢谢! As ...

  9. Artwork (Gym - 102346A)【DFS、连通块】

    Artwork (Gym - 102346A) 题目链接 算法 DFS,连通块 时间复杂度:O(k*n + k * k) 1.这道题就是让你判断从(0,0)到(m,n),避开中途所有的传感器(传感器的 ...

  10. 微服务分布式电商项目学习笔记(三)---- docker介绍安装以及使用docker安装软件(2020/7/10)

    其实在介绍docker的使用和安装之前应该还要介绍虚拟机的安装与配置,以及虚拟网络的配置,但是我使用的是vmware,而视频课使用的是vagrant,这一块我简看的,因此没有过多的介绍,至于vmwar ...