Giv en HTTP-klient i Go sin egen proxy
Klon Gos standardtransport, angiv ProxyURL for den valgte proxy-IP, og undgå at ændre andre klienters proxyadfærd.
Transporten i en HTTP-klient i Go vælger proxyen. Klon standardtransporten, før du ændrer den, så andre brugere af standardklienten beholder deres eksisterende ruter.
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 er en pladsholder til dokumentation. Erstat den med IP og port for en rigtig HTTP-proxy, for eksempel en kandidat fra listen over HTTP-proxyer. Eksemplet bruger kun Gos standardbibliotek; denne HTTP-proxyanmodning kræver hverken en SOCKS-pakke eller en miljøvariabel for hele processen.
Hvorfor ikke ændre DefaultTransport direkte?
Standardtransporten deles. En ændring kan påvirke kode, som aldrig bad om at bruge din proxy, og ændringer, mens anmodninger bruger transporten, skaber undgåelige samtidighedsproblemer. En særskilt transport gør ruten til en del af netop denne klients konfiguration.
http.ProxyURL returnerer en vælger, som konsekvent vælger den angivne URL. Det adskiller sig fra standardvælgeren for miljøet, som tager hensyn til proxyvariabler og undtagelsesregler. Hvis du vil teste en bestemt post fra HTTP-listen, fjerner den eksplicitte vælger denne kilde til tvetydighed.
Luk svaret, og genbrug klienten
Eksemplet læser hele svarkroppen og lukker den. At læse til ende hjælper transporten med at genbruge forbindelsen, når det er muligt. I et program med flere anmodninger gennem samme proxy bør du beholde klienten og transporten i stedet for at oprette et nyt par til hver anmodning.
Klientens timeout omfatter mere end åbning af socketen; den begrænser også anmodningens livscyklus, herunder læsning af svarkroppen. Læsefejl skal stadig håndteres, efter at Get er returneret. En status som 403 er ikke en Go-transportfejl, så kontroller StatusCode adskilt fra err.