zoukankan      html  css  js  c++  java
  • 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.使用方法

    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内置功能了。
  • 相关阅读:
    zoj1028-Flip and Shift
    OSI七层模型基础知识及各层常见应用
    隐藏AutoCompleteTextView下拉框的滚动条
    VC++笔记七
    [置顶] 无名管道的C++封装
    张佩的Dump服务
    Oracle Autonomous Transactions(自治事务)
    Computational Geometry Template
    普通人和牛人之间的差距之举一反三能力
    关于选择
  • 原文地址:https://www.cnblogs.com/janbar/p/13698975.html
Copyright © 2011-2022 走看看