Go HTTP mijozida proksini transport tanlaydi. Standart mijozning boshqa foydalanuvchilari mavjud yo‘nalishini saqlashi uchun standart transportni o‘zgartirishdan oldin klonlang.

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

Manzil hujjatlar uchun namuna qiymatdir. Uni HTTP proksi ro‘yxatidan tanlangan nomzod kabi haqiqiy HTTP proksi IP-si va porti bilan almashtiring. Misol faqat Go standart kutubxonasidan foydalanadi; bu HTTP proksi so‘rovi uchun SOCKS paketi yoki butun jarayonga ta’sir qiladigan muhit o‘zgaruvchisi kerak emas.

Nega DefaultTransportni bevosita o‘zgartirmaslik kerak?

Standart transport umumiy. Uni o‘zgartirish proksingizni ishlatishni hech so‘ramagan kodga ta’sir qilishi mumkin; so‘rovlar undan foydalanayotganda o‘zgartirish esa oldini olish mumkin bo‘lgan parallel ishlash muammolarini keltiradi. Alohida transport yo‘nalishni shu mijoz sozlamasining bir qismiga aylantiradi.

http.ProxyURL doim berilgan URLni tanlaydigan tanlagich qaytaradi. Bu proksi o‘zgaruvchilari va chetlab o‘tish qoidalarini hisobga oladigan standart muhit tanlagichidan farq qiladi. Maqsadingiz HTTP ro‘yxatidagi aniq bitta yozuvni tekshirish bo‘lsa, aniq ko‘rsatilgan tanlagich shu noaniqlik manbasini yo‘qotadi.

Javobni yoping va mijozdan qayta foydalaning

Misol javob tanasini oxirigacha o‘qib yopadi. To‘liq o‘qish transportga imkon bo‘lganda ulanishdan qayta foydalanishga yordam beradi. Bir proksi orqali bir necha so‘rov yuboradigan dasturda har so‘rov uchun yangi juft yaratmay, mijoz va transportni saqlang.

Mijozning vaqt chegarasi faqat soket ochilishini emas, javob tanasini o‘qish ham kiradigan so‘rov hayot davrini ham cheklaydi. Get qaytgandan keyin ham o‘qish xatolarini qayta ishlash kerak. 403 kabi holat Go transport xatosi emas; shu sabab StatusCodeni errdan alohida tekshiring.

O'xshash maqolalar