Lasten posrednik za odjemalca HTTP v Go
Klonirajte privzeti transport Go, nastavite ProxyURL za izbrani IP in ne spreminjajte vedenja drugih odjemalcev.
Posrednika izbere transport odjemalca HTTP v Go. Pred spremembo klonirajte standardni transport, da drugi uporabniki privzetega odjemalca ohranijo obstoječe poti.
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)
}
}
Naslov je dokumentacijski primer. Zamenjajte ga z resničnim IP-jem in vrati posrednika HTTP, denimo s kandidatom s seznama posrednikov HTTP. Primer uporablja samo standardno knjižnico Go; ta zahteva prek posrednika HTTP ne potrebuje paketa SOCKS ali okoljske spremenljivke za celoten proces.
Zakaj ne spremeniti DefaultTransport neposredno?
Privzeti transport je skupen. Njegova sprememba lahko vpliva na kodo, ki nikoli ni zahtevala vašega posrednika, spreminjanje med uporabo pa povzroči nepotrebne težave s sočasnostjo. Lasten transport naredi pot del konfiguracije tega odjemalca.
http.ProxyURL vrne izbirnik, ki vedno izbere podani URL. Razlikuje se od privzetega okoljskega izbirnika, ki upošteva spremenljivke posrednika in pravila obhoda. Če želite preizkusiti določen vnos s seznama HTTP, izrecni izbirnik odstrani ta vir dvoumnosti.
Zaprite odgovor in znova uporabite odjemalca
Primer prebere celotno telo odgovora in ga zapre. Branje do konca pomaga transportu ponovno uporabiti povezavo, kadar je to mogoče. Če program pošilja več zahtev skozi istega posrednika, ohranite odjemalca in transport namesto ustvarjanja novega para za vsako zahtevo.
Časovna omejitev odjemalca ne pokriva le odpiranja vtičnice, temveč tudi življenjski cikel zahteve, vključno z branjem telesa odgovora. Napake branja je treba obravnavati tudi po vrnitvi Get. Status, kot je 403, ni napaka transporta Go, zato preverjajte StatusCode ločeno od err.