Go HTTP kliento transportas parenka tarpinį serverį. Prieš keisdami klonuokite standartinį transportą, kad kiti numatytojo kliento naudotojai išlaikytų esamus 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)
    }
}

Adresas yra dokumentacijos pavyzdys. Pakeiskite jį tikru HTTP tarpinio serverio IP ir prievadu, pavyzdžiui, kandidatu iš HTTP tarpinių serverių sąrašo. Pavyzdyje naudojama tik standartinė Go biblioteka; šiai HTTP tarpinio serverio užklausai nereikia SOCKS paketo ar visam procesui skirto aplinkos kintamojo.

Kodėl nekeisti DefaultTransport tiesiogiai?

Numatytasis transportas yra bendras. Jį pakeitus gali pasikeisti kodas, kuris niekada neprašė naudoti jūsų tarpinio serverio. Keisti transportą, kol jį naudoja užklausos, taip pat reiškia sukelti išvengiamų lygiagretumo problemų. Atskiras transportas maršrutą paverčia šio kliento konfigūracijos dalimi.

http.ProxyURL grąžina parinkiklį, kuris visada pasirenka pateiktą URL. Tai skiriasi nuo numatytojo aplinkos parinkiklio, kuris atsižvelgia į tarpinio serverio kintamuosius ir apėjimo taisykles. Jei norite patikrinti vieną konkretų HTTP sąrašo įrašą, aiškiai nurodytas parinkiklis pašalina šį neapibrėžtumą.

Uždarykite atsakymą ir naudokite klientą pakartotinai

Pavyzdys perskaito visą atsakymo turinį ir jį uždaro. Skaitymas iki galo padeda transportui pakartotinai naudoti ryšį, kai tai įmanoma. Jei programa siunčia kelias užklausas per tą patį tarpinį serverį, išlaikykite klientą ir transportą, o ne kurkite naują porą kiekvienai užklausai.

Kliento skirtasis laikas apima ne tik lizdo atidarymą, bet ir užklausos gyvavimo ciklą, įskaitant atsakymo turinio skaitymą. Skaitymo klaidas vis dar reikia apdoroti grįžus iš Get. Būsena, tokia kaip 403, nėra Go transporto klaida, todėl StatusCode tikrinkite atskirai nuo err.

Susiję straipsniai