Bigyan ng sariling proxy ang Go HTTP client
I-clone ang default transport ng Go, itakda ang ProxyURL para sa napiling proxy IP, at huwag baguhin ang proxy behavior ng ibang client.
Transport ng Go HTTP client ang pumipili ng proxy. I-clone muna ang standard transport bago ito baguhin para mapanatili ng ibang gumagamit ng default client ang dati nilang ruta.
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)
}
}
Halimbawang address para sa dokumentasyon ito. Palitan ng IP at port ng totoong HTTP proxy, gaya ng kandidatong pinili sa listahan ng HTTP proxy. Standard library lang ng Go ang gamit sa halimbawa; hindi kailangan ng SOCKS package o environment variable para sa buong process sa HTTP proxy request na ito.
Bakit hindi direktang baguhin ang DefaultTransport?
Pinagsasaluhan ang default transport. Kapag binago ito, maaaring maapektuhan ang code na hindi naman humiling ng proxy mo. Ang pagbabago habang may mga request na gumagamit dito ay lumilikha rin ng concurrency problem na maiiwasan sana. Sa dedicated transport, bahagi ng configuration ng client na ito ang ruta.
Nagbabalik ang http.ProxyURL ng selector na laging pumipili sa ibinigay na URL. Iba ito sa default environment selector na tumitingin sa mga proxy variable at bypass rule. Kung gusto mong subukan ang isang partikular na entry sa HTTP list, inaalis ng tahasang selector ang pinagmumulang ito ng kalituhan.
Isara ang response at muling gamitin ang client
Binabasa ng halimbawa ang buong response body at isinasara ito. Ang pagbasa hanggang dulo ay tumutulong sa transport na muling gamitin ang koneksyon kapag maaari. Sa programang may ilang request sa iisang proxy, panatilihin ang client at transport sa halip na gumawa ng bagong pares sa bawat request.
Hindi lang pagbukas ng socket ang sakop ng timeout ng client; nililimitahan din nito ang lifecycle ng request, kasama ang pagbasa sa response body. Kailangan pa ring asikasuhin ang mga read error pagkatapos bumalik ng Get. Hindi Go transport error ang status na gaya ng 403, kaya suriin ang StatusCode nang hiwalay sa err.