Go HTTP müştərisinə ayrıca proksi verin
Go-nun standart transport-unu klonlayın, seçilmiş proksi IP-si üçün ProxyURL təyin edin və digər müştərilərin davranışını dəyişməyin.
Go HTTP müştərisində proksini transport seçir. Standart müştərinin digər istifadəçiləri mövcud marşrutlarını saxlasın deyə standart transport-u dəyişməzdən əvvəl klonlayın.
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)
}
}
Ünvan sənədləşdirmə üçün yer tutucudur. Onu HTTP proksi siyahısından seçilmiş namizəd kimi həqiqi HTTP proksi IP-si və portu ilə əvəz edin. Nümunə yalnız Go-nun standart kitabxanasından istifadə edir; bu HTTP proksi sorğusuna SOCKS paketi və ya bütün proses üçün mühit dəyişəni lazım deyil.
Niyə DefaultTransport-u birbaşa dəyişməməli?
Standart transport ortaqdır. Onu dəyişmək proksinizi heç istəməmiş koda təsir edə bilər; sorğular istifadə edərkən dəyişmək isə qarşısı alına bilən paralellik problemləri yaradır. Ayrı transport marşrutu məhz bu müştərinin konfiqurasiyasının hissəsi edir.
http.ProxyURL həmişə verilmiş URL-i seçən seçici qaytarır. Bu, proksi dəyişənlərini və yan keçmə qaydalarını nəzərə alan standart mühit seçicisindən fərqlidir. Məqsədiniz HTTP siyahısındakı müəyyən bir qeydi sınamaqdırsa, açıq seçici bu qeyri-müəyyənlik mənbəyini aradan qaldırır.
Cavabı bağlayın və müştəridən yenidən istifadə edin
Nümunə cavab gövdəsini sona qədər oxuyur və bağlayır. Tam oxumaq transport-un mümkün olduqda bağlantıdan yenidən istifadəsinə kömək edir. Eyni proksidən bir neçə sorğu göndərən proqramda hər sorğu üçün yeni cüt yaratmaq əvəzinə müştərini və transport-u saxlayın.
Müştərinin vaxt limiti təkcə soketin açılmasını yox, cavab gövdəsinin oxunması daxil olmaqla sorğunun həyat dövrünü də məhdudlaşdırır. Get qayıtdıqdan sonra da oxuma xətaları işlənməlidir. 403 kimi status Go transport xətası deyil; buna görə StatusCode və err dəyərlərini ayrı yoxlayın.