Gi en HTTP-klient i Go sin egen proxy
Klon Gos standardtransport, sett ProxyURL til valgt proxy-IP, og unngå å endre proxyatferden til andre klienter.
Transporten til en HTTP-klient i Go velger proxyen. Klon standardtransporten før du endrer den, slik at andre brukere av standardklienten beholder sine 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 dokumentasjonsplassholder. Bytt den ut med IP og port til en virkelig HTTP-proxy, for eksempel en kandidat fra listen over HTTP-proxyer. Eksemplet bruker bare Gos standardbibliotek; denne HTTP-proxyforespørselen krever verken en SOCKS-pakke eller en miljøvariabel for hele prosessen.
Hvorfor ikke endre DefaultTransport direkte?
Standardtransporten er delt. Å endre den kan påvirke kode som aldri ba om å bruke proxyen din, og endringer mens forespørsler bruker den, skaper unødvendige samtidighetsproblemer. En egen transport gjør ruten til en del av konfigurasjonen til akkurat denne klienten.
http.ProxyURL returnerer en velger som konsekvent velger den oppgitte URL-en. Dette skiller seg fra standardvelgeren for miljøet, som tar hensyn til proxyvariabler og unntaksregler. Hvis du vil teste én bestemt oppføring i HTTP-listen, fjerner den eksplisitte velgeren denne kilden til tvetydighet.
Lukk svaret og bruk klienten om igjen
Eksemplet leser hele svarkroppen og lukker den. Fullstendig lesing hjelper transporten med å bruke forbindelsen om igjen når det er mulig. I et program som sender flere forespørsler gjennom samme proxy, bør du beholde klienten og transporten i stedet for å lage et nytt par for hver forespørsel.
Klientens tidsavbrudd dekker mer enn åpningen av socketen; det begrenser også forespørselens livssyklus, inkludert lesing av svarkroppen. Lesefeil må fortsatt håndteres etter at Get returnerer. En status som 403 er ikke en Go-transportfeil, så kontroller StatusCode separat fra err.