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 स्वतंत्रपणे तपासा.

संबंधित लेख