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 պրոքսիի IP-ով և պորտով, օրինակ՝ HTTP պրոքսիների ցանկից ընտրված թեկնածուով։ Օրինակն օգտագործում է միայն Go-ի ստանդարտ գրադարանը․ այս HTTP պրոքսիի հարցման համար պետք չէ SOCKS փաթեթ կամ ամբողջ գործընթացի միջավայրի փոփոխական։

Ինչո՞ւ ուղղակի չփոխել DefaultTransport-ը

Լռելյայն transport-ը ընդհանուր է։ Փոխելը կարող է ազդել կոդի վրա, որը երբեք չի խնդրել օգտագործել ձեր պրոքսին, իսկ հարցումների ընթացքում այն փոխելը ստեղծում է զուգահեռ աշխատանքի խուսափելի խնդիրներ։ Առանձին transport-ը երթուղին դարձնում է այս հաճախորդի կարգավորման մաս։

http.ProxyURL-ը վերադարձնում է ընտրիչ, որը միշտ ընտրում է տրված URL-ը։ Այն տարբերվում է լռելյայն միջավայրային ընտրիչից, որը հաշվի է առնում պրոքսիի փոփոխականներն ու շրջանցման կանոնները։ Եթե ցանկանում եք ստուգել HTTP ցանկի մեկ որոշակի գրառում, բացահայտ ընտրիչը վերացնում է այս անորոշությունը։

Փակեք պատասխանը և կրկին օգտագործեք հաճախորդը

Օրինակը մինչև վերջ կարդում է պատասխանի մարմինն ու փակում այն։ Ամբողջական ընթերցումը օգնում է transport-ին հնարավորության դեպքում կրկին օգտագործել կապը։ Նույն պրոքսիով մի քանի հարցում կատարող ծրագրում պահեք հաճախորդն ու transport-ը՝ ամեն հարցման համար նոր զույգ ստեղծելու փոխարեն։

Հաճախորդի ժամանակային սահմանը միայն սոքեթի բացումը չէ․ այն սահմանափակում է նաև հարցման կյանքի ցիկլը՝ ներառյալ պատասխանի մարմնի ընթերցումը։ Ընթերցման սխալները պետք է մշակել նաև Get-ի վերադարձից հետո։ 403-ի նման կարգավիճակը Go transport-ի սխալ չէ, ուստի StatusCode-ը ստուգեք err-ից առանձին։

Առնչվող հոդվածներ