Transporti i klientit HTTP në Go zgjedh proxy-n. Klononi transportin standard para ndryshimit, që përdoruesit e tjerë të klientit të parazgjedhur të ruajnë rrugët ekzistuese.

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

Adresa është një shembull dokumentacioni. Zëvendësojeni me IP-në dhe portën e një proxy HTTP të vërtetë, për shembull një kandidat nga lista e proxy-ve HTTP. Shembulli përdor vetëm bibliotekën standarde të Go; kjo kërkesë përmes proxy-t HTTP nuk ka nevojë për paketë SOCKS ose ndryshore mjedisi për gjithë procesin.

Pse të mos ndryshoni drejtpërdrejt DefaultTransport?

Transporti i parazgjedhur ndahet mes përdoruesve. Ndryshimi mund të ndikojë kod që nuk kërkoi kurrë proxy-n tuaj, dhe ndryshimi gjatë përdorimit nga kërkesat krijon probleme bashkëveprimi të njëkohshëm që mund të shmangen. Një transport i dedikuar e bën rrugën pjesë të konfigurimit të këtij klienti.

http.ProxyURL kthen një përzgjedhës që zgjedh gjithmonë URL-në e dhënë. Kjo ndryshon nga përzgjedhësi i parazgjedhur i mjedisit, që merr parasysh ndryshoret proxy dhe rregullat e anashkalimit. Nëse doni të testoni një hyrje të caktuar nga lista HTTP, përzgjedhësi i shprehur qartë e heq këtë burim paqartësie.

Mbyllni përgjigjen dhe ripërdorni klientin

Shembulli lexon të gjithë trupin e përgjigjes dhe e mbyll. Leximi deri në fund ndihmon transportin ta ripërdorë lidhjen kur mundet. Në një program me disa kërkesa përmes të njëjtit proxy, ruani klientin dhe transportin në vend që të krijoni një çift të ri për çdo kërkesë.

Kufiri kohor i klientit nuk mbulon vetëm hapjen e socket-it; kufizon edhe ciklin e kërkesës, përfshirë leximin e trupit të përgjigjes. Gabimet e leximit duhen trajtuar edhe pas kthimit të Get. Një status si 403 nuk është gabim transporti në Go, prandaj kontrolloni StatusCode veçmas nga err.

Artikuj të ngjashëm