Go-HTTP-asiakkaan transport valitsee välityspalvelimen. Kloonaa oletustransport ennen muuttamista, jotta muut oletusasiakkaan käyttäjät säilyttävät nykyiset reittinsä.

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

Osoite on dokumentaatioesimerkki. Korvaa se oikean HTTP-välityspalvelimen IP-osoitteella ja portilla, esimerkiksi HTTP-välityspalvelinluettelosta valitulla ehdokkaalla. Esimerkki käyttää vain Go-kielen vakiokirjastoa; tähän HTTP-välityspalvelinpyyntöön ei tarvita SOCKS-pakettia eikä koko prosessin ympäristömuuttujaa.

Miksi DefaultTransportia ei kannata muuttaa suoraan?

Oletustransport on jaettu. Sen muuttaminen voi vaikuttaa koodiin, jonka ei ollut tarkoitus käyttää välityspalvelintasi. Muutokset pyyntöjen käyttäessä sitä aiheuttavat myös vältettävissä olevia rinnakkaisuusongelmia. Oma transport tekee reitistä juuri tämän asiakkaan asetuksen.

http.ProxyURL palauttaa valitsimen, joka valitsee aina annetun URL:n. Se eroaa ympäristön oletusvalitsimesta, joka huomioi välityspalvelinmuuttujat ja ohitussäännöt. Jos haluat testata yhtä tiettyä HTTP-luettelon riviä, nimenomainen valitsin poistaa tämän epäselvyyden.

Sulje vastaus ja käytä asiakasta uudelleen

Esimerkki lukee vastausrungon loppuun ja sulkee sen. Loppuun lukeminen auttaa transportia käyttämään yhteyttä uudelleen, kun se on mahdollista. Jos ohjelma tekee useita pyyntöjä saman välityspalvelimen kautta, säilytä asiakas ja transport sen sijaan, että loisit uuden parin joka pyynnölle.

Asiakkaan aikakatkaisu ei rajoita vain soketin avaamista vaan myös pyynnön elinkaarta, mukaan lukien vastausrungon lukeminen. Lukuvirheet on yhä käsiteltävä Get-kutsun palattua. Tila kuten 403 ei ole Go-kielen transport-virhe, joten tarkista StatusCode erillään arvosta err.

Aiheeseen liittyvät artikkelit