Ge en HTTP-klient i Go en egen proxy
Klona Gos standardtransport, ange ProxyURL för vald proxy-IP och undvik att ändra andra klienters proxybeteende.
Transporten i en HTTP-klient i Go väljer proxyn. Klona standardtransporten innan du ändrar den så att andra användare av standardklienten behåller sina befintliga vägar.
package main
import (
"fmt"
"io"
"log"
"net/http"
"net/url"
"time"
)
func main() {
proxyURL, err := url.Parse("http://203.0.113.10:8080")
if err != nil {
log.Fatal(err)
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
defer transport.CloseIdleConnections()
client := &http.Client{
Transport: transport,
Timeout: 15 * time.Second,
}
response, err := client.Get("https://example.com/")
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
fmt.Println(response.StatusCode)
if _, err := io.Copy(io.Discard, response.Body); err != nil {
log.Fatal(err)
}
}
Adressen är ett dokumentationsexempel. Byt ut den mot IP och port för en riktig HTTP-proxy, till exempel en kandidat från listan över HTTP-proxyer. Exemplet använder bara Gos standardbibliotek; den här HTTP-proxybegäran behöver inget SOCKS-paket eller någon miljövariabel för hela processen.
Varför inte ändra DefaultTransport direkt?
Standardtransporten delas. Ändringar kan påverka kod som aldrig bad om att använda din proxy, och ändringar medan begäranden använder transporten skapar samtidighetsproblem som går att undvika. En egen transport gör vägen till en del av just den här klientens konfiguration.
http.ProxyURL returnerar en väljare som alltid väljer den angivna URL:en. Det skiljer sig från standardväljaren för miljön, som tar hänsyn till proxyvariabler och undantagsregler. Om du vill testa en viss post i HTTP-listan tar den uttryckliga väljaren bort den här tvetydigheten.
Stäng svaret och återanvänd klienten
Exemplet läser hela svarskroppen och stänger den. Fullständig läsning hjälper transporten att återanvända anslutningen när det går. I ett program som gör flera begäranden genom samma proxy behåller du klienten och transporten i stället för att skapa ett nytt par för varje begäran.
Klientens timeout omfattar mer än att öppna socketen; den begränsar också begärans livscykel, inklusive läsningen av svarskroppen. Läsfel måste fortfarande hanteras efter att Get har returnerat. En status som 403 är inget transportfel i Go, så kontrollera StatusCode separat från err.