Gje ein HTTP-klient i Go sin eigen proxy
Klon standardtransporten i Go, set ProxyURL til vald proxy-IP, og unngå å endre proxyåtferda til andre klientar.
Transporten til ein HTTP-klient i Go vel proxyen. Klon standardtransporten før du endrar han, slik at andre brukarar av standardklienten held på dei eksisterande rutene sine.
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)
}
}
Adressa er ein dokumentasjonsplasshaldar. Byt henne ut med IP og port til ein verkeleg HTTP-proxy, til dømes ein kandidat frå lista over HTTP-proxyar. Dømet brukar berre standardbiblioteket i Go; denne HTTP-proxyførespurnaden krev verken ein SOCKS-pakke eller ein miljøvariabel for heile prosessen.
Kvifor ikkje endre DefaultTransport direkte?
Standardtransporten er delt. Å endre han kan påverke kode som aldri bad om å bruke proxyen din, og endringar medan førespurnader brukar han, skaper unødige samtidigheitsproblem. Ein eigen transport gjer ruta til ein del av konfigurasjonen til akkurat denne klienten.
http.ProxyURL returnerer ein veljar som konsekvent vel den oppgjevne URL-en. Dette skil seg frå standardveljaren for miljøet, som tek omsyn til proxyvariablar og unntaksreglar. Dersom du vil teste éi bestemt oppføring i HTTP-lista, fjernar den eksplisitte veljaren denne kjelda til tvityding.
Lukk svaret og bruk klienten om att
Dømet les heile svarkroppen og lukkar han. Fullstendig lesing hjelper transporten med å bruke sambandet om att når det er mogleg. I eit program som sender fleire førespurnader gjennom same proxy, bør du halde på klienten og transporten i staden for å lage eit nytt par for kvar førespurnad.
Tidsavbrotet til klienten dekkjer meir enn opninga av socketen; det avgrensar òg livssyklusen til førespurnaden, inkludert lesing av svarkroppen. Lesefeil må framleis handterast etter at Get returnerer. Ein status som 403 er ikkje ein Go-transportfeil, så kontroller StatusCode separat frå err.