2013-02-02 7 views
29

Ich versuche, den HTTP-Client so einzurichten, dass er einen Proxy verwendet, aber ich kann nicht genau verstehen, wie es geht. In der Dokumentation wird mehrfach auf "Proxy" verwiesen, aber keine der Funktionen scheint es zu ermöglichen, den Proxy zu definieren. Was ich brauche, ist etwas in der Art:Proxy für HTTP-Client einrichten

client := &http.Client{} 
client.SetProxy("someip:someport") // pseudo code 
resp, err := client.Get("http://example.com") // do request through proxy 

Irgendeine Idee, wie man das in Go macht?

Antwort

70

lukad korrekt ist, können Sie die HTTP_PROXY Umgebungsvariable könnte, wenn Sie dies tun Go wird es standardmäßig verwenden.

Bash:

export HTTP_PROXY="http://proxyIp:proxyPort" 

Go:

os.Setenv("HTTP_PROXY", "http://proxyIp:proxyPort") 

Sie können auch Ihre eigene http.Client konstruieren, die einen Proxy unabhängig von der Umgebung der Konfiguration verwenden müssen: Diese

proxyUrl, err := url.Parse("http://proxyIp:proxyPort") 
myClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} 

Dies ist nützlich, wenn Sie sich nicht auf die Konfiguration der Umgebung verlassen können oder sie nicht ändern möchten.

Sie können auch den Standardtransport ändern, der vom Paket "net/http" verwendet wird. Dies würde sich auf Ihr gesamtes Programm auswirken (einschließlich des Standard-HTTP-Clients).

proxyUrl, err := url.Parse("http://proxyIp:proxyPort") 
http.DefaultTransport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)} 
+0

In der Tat, ich muss gleichzeitig mehrere Anfragen senden, jeder mit einem anderen Proxy, so dass Ihre zweite Lösung ist wahrscheinlich, was ich brauche. Es scheint jedoch nicht zu funktionieren, ich bekomme diesen Fehler für alle Proxies: 'Get http://StackOverflow.com: http: Fehler beim Verbinden mit Proxy 87.236.233.92: 8080: GetServByName: Der angeforderte Name ist gültig, aber keine Daten des angeforderten Typs gefunden. "Irgendeine Idee was es bedeutet? –

+0

Ich habe meine Antwort auf diese Frage dort - http://Stackoverflow.com/q/14669958/561309 –

+0

FYI: 'URL 'ist in [net/URL] (https://golang.org/pkg/net/url /) –

6

Go verwendet den Proxy, der in der Umgebungsvariablen HTTP_PROXY definiert ist, wenn er gesetzt ist. Andernfalls wird kein Proxy verwendet.

Man könnte es wie folgt tun:

os.Setenv("HTTP_PROXY", "http://someip:someport") 
resp, err := http.Get("http://example.com") 
if err != nil { 
    panic(err) 
} 
+1

FYI - die 'Rückkehr' nach der' Panik' [ist überflüssig] (http://blog.golang.org/defer-panic-and-recover). –

2

Sie auch diese könnten versuchen, Mai:

url_i := url.URL{} 
url_proxy, _ := url_i.Parse(proxy_addr) 

transport := http.Transport{}  
transport.Proxy = http.ProxyURL(url_proxy)// set proxy 
transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //set ssl 

client := &http.Client{} 
client.Transport = transport 
resp, err := client.Get("http://example.com") // do request through proxy 
0

Für eine alternative Art und Weise können Sie auch GoRequest verwenden, die eine Funktion hat, die Sie Proxy leicht für jede einzelne Anforderung einstellen.

request := gorequest.New() 
resp, body, errs:= request.Proxy("http://proxy:999").Get("http://example.com").End() 
resp2, body2, errs2 := request.Proxy("http://proxy2:999").Get("http://example2.com").End() 

Oder Sie können für das ganze auf einmal einstellen.

request := gorequest.New().Proxy("http://proxy:999") 
resp, body, errs:= request.Get("http://example.com").End() 
resp2, body2, errs2 := request.Get("http://example2.com").End() 
+0

gorequest unterstützt keine Socken-Proxies –

Verwandte Themen