Go HTTP klienta transports izvēlas starpniekserveri. Pirms izmaiņām klonējiet standarta transportu, lai citi noklusētā klienta lietotāji saglabātu esošos maršrutus.

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)
    }
}

Adrese ir dokumentācijas piemērs. Aizstājiet to ar īsta HTTP starpniekservera IP un portu, piemēram, kandidātu no HTTP starpniekserveru saraksta. Piemērs izmanto tikai Go standarta bibliotēku; šim HTTP starpniekservera pieprasījumam nevajag SOCKS pakotni vai procesa mēroga vides mainīgo.

Kāpēc nemainīt DefaultTransport tieši?

Noklusētais transports ir koplietots. Tā maiņa var ietekmēt kodu, kas nekad nav prasījis izmantot jūsu starpniekserveri. Izmaiņas laikā, kad to lieto pieprasījumi, rada arī novēršamas vienlaicīguma problēmas. Atsevišķs transports padara maršrutu par šī klienta konfigurācijas daļu.

http.ProxyURL atgriež atlasītāju, kas vienmēr izvēlas norādīto URL. Tas atšķiras no noklusētā vides atlasītāja, kas ņem vērā starpniekservera mainīgos un apiešanas noteikumus. Ja vēlaties pārbaudīt vienu konkrētu HTTP saraksta ierakstu, skaidri norādīts atlasītājs novērš šo neskaidrību.

Aizveriet atbildi un izmantojiet klientu atkārtoti

Piemērs nolasa visu atbildes saturu un to aizver. Lasīšana līdz galam palīdz transportam atkārtoti izmantot savienojumu, kad tas ir iespējams. Ja programma sūta vairākus pieprasījumus caur to pašu starpniekserveri, saglabājiet klientu un transportu, nevis veidojiet jaunu pāri katram pieprasījumam.

Klienta noildze aptver ne tikai ligzdas atvēršanu, bet arī pieprasījuma dzīves ciklu, tostarp atbildes satura lasīšanu. Lasīšanas kļūdas joprojām jāapstrādā pēc Get atgriešanās. Statuss, piemēram, 403, nav Go transporta kļūda, tāpēc pārbaudiet StatusCode atsevišķi no err.

Saistītie raksti