Go HTTP клиентінде проксиді transport таңдайды. Әдепкі клиенттің басқа пайдаланушылары бар маршруттарын сақтауы үшін стандартты transport-ты өзгертпес бұрын клондаңыз.

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

Мекенжай — құжаттамалық үлгі. Оны HTTP прокси тізімінен таңдалған үміткер сияқты нақты HTTP прокси IP-і және портымен ауыстырыңыз. Мысал тек Go стандартты кітапханасын қолданады; бұл HTTP прокси сұрауына SOCKS пакеті де, бүкіл процеске әсер ететін орта айнымалысы да қажет емес.

Неліктен DefaultTransport-ты тікелей өзгертпеу керек?

Әдепкі transport ортақ. Оны өзгерту проксиіңізді қолдануды сұрамаған кодқа әсер етуі мүмкін; сұраулар оны қолданып жатқанда өзгерту болдырмауға болатын қатар орындалу мәселелерін туғызады. Жеке transport маршрутты осы клиент баптауының бөлігі етеді.

http.ProxyURL әрдайым берілген URL-ді таңдайтын таңдағыш қайтарады. Бұл прокси айнымалылары мен айналып өту ережелерін ескеретін әдепкі орта таңдағышынан өзгеше. Мақсатыңыз HTTP тізіміндегі бір нақты жазбаны тексеру болса, анық таңдағыш осы екіұштылық көзін жояды.

Жауапты жауып, клиентті қайта пайдаланыңыз

Мысал жауап денесін соңына дейін оқып жабады. Толық оқу transport-қа мүмкін болғанда қосылымды қайта пайдалануға көмектеседі. Бір прокси арқылы бірнеше сұрау жіберетін бағдарламада әр сұрауға жаңа жұп жасамай, клиент пен transport-ты сақтаңыз.

Клиенттің тайм-ауты тек сокетті ашуды емес, жауап денесін оқуды қамтитын сұрау өмірлік циклін де шектейді. Get қайтқаннан кейін де оқу қателерін өңдеу керек. 403 сияқты күй Go transport қатесі емес, сондықтан StatusCode пен err мәндерін бөлек тексеріңіз.

Қатысты мақалалар