Go HTTP-kliendi transport valib proksi. Klooni standardtransport enne muutmist, et teised vaikekliendi kasutajad säilitaksid oma senised marsruudid.

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

Aadress on dokumentatsiooni kohatäide. Asenda see tegeliku HTTP-proksi IP ja pordiga, näiteks HTTP-prokside loendist valitud kandidaadiga. Näide kasutab ainult Go standardteeki; selle HTTP-proksipäringu jaoks pole vaja SOCKS-paketti ega kogu protsessi keskkonnamuutujat.

Miks mitte muuta DefaultTransporti otse?

Vaiketransport on jagatud. Selle muutmine võib mõjutada koodi, mis pole sinu proksit kunagi soovinud kasutada. Transpordi muutmine ajal, mil päringud seda kasutavad, tekitab ka välditavaid rööptöötlusprobleeme. Eraldi transport teeb marsruudi selle kliendi seadistuse osaks.

http.ProxyURL tagastab valija, mis valib alati antud URL-i. See erineb keskkonna vaikevalijast, mis arvestab proksimuutujaid ja möödapääsureegleid. Kui tahad testida üht kindlat HTTP-loendi kirjet, eemaldab selgesõnaline valija selle mitmetimõistetavuse allika.

Sulge vastus ja kasuta klienti uuesti

Näide loeb vastusekeha lõpuni ja sulgeb selle. Lõpuni lugemine aitab transpordil ühendust võimaluse korral uuesti kasutada. Kui programm teeb sama proksi kaudu mitu päringut, säilita klient ja transport, mitte ära loo iga päringu jaoks uut paari.

Kliendi ajalõpp ei piirdu sokli avamisega, vaid piirab ka päringu elutsüklit, sealhulgas vastusekeha lugemist. Lugemisvigu tuleb käsitleda ka pärast Get naasmist. Olek nagu 403 ei ole Go transpordiviga, seega kontrolli StatusCode eraldi väärtusest err.

Seotud artiklid