Go HTTP client ရဲ့ transport က ပရောက်စီကို ရွေးပါတယ်။ မူလ client ကို သုံးတဲ့ တခြားကုဒ်တွေ လက်ရှိလမ်းကြောင်းအတိုင်း ဆက်သုံးနိုင်ဖို့ စံ 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 package ဒါမှမဟုတ် ပရိုဆက်စ်တစ်ခုလုံးအတွက် environment variable မလိုပါ။

DefaultTransport ကို တိုက်ရိုက်မပြောင်းရတဲ့အကြောင်း

မူလ transport ကို မျှဝေသုံးပါတယ်။ အဲဒါကိုပြောင်းရင် သင့်ပရောက်စီမသုံးခိုင်းထားတဲ့ ကုဒ်ကိုပါ ထိခိုက်နိုင်ပြီး တောင်းဆိုမှုတွေ အသုံးပြုနေချိန် ပြောင်းရင် ရှောင်လို့ရတဲ့ တစ်ပြိုင်နက်လုပ်ဆောင်မှုပြဿနာတွေ ဖြစ်စေပါတယ်။ သီးသန့် transport က လမ်းကြောင်းကို ဒီ client ရဲ့ သတ်မှတ်ချက်အစိတ်အပိုင်း ဖြစ်စေပါတယ်။

http.ProxyURL က ပေးထားတဲ့ URL ကို အမြဲရွေးတဲ့ selector ပြန်ပေးပါတယ်။ ပရောက်စီ variable တွေနဲ့ ကျော်သွားရမယ့်စည်းမျဉ်းတွေကို ထည့်တွက်တဲ့ မူလ environment selector နဲ့ မတူပါ။ HTTP စာရင်းထဲက သတ်မှတ်ထားတဲ့တစ်ခုကိုပဲ စမ်းလိုရင် ရှင်းရှင်းသတ်မှတ်ထားတဲ့ selector က ဒီမသေချာမှုကို ဖယ်ရှားပါတယ်။

တုံ့ပြန်ချက်ကို ပိတ်ပြီး client ပြန်သုံးပါ

ဥပမာက response body ကို အဆုံးအထိဖတ်ပြီး ပိတ်ပါတယ်။ အပြည့်ဖတ်တာက transport ကို ဖြစ်နိုင်တဲ့အခါ ချိတ်ဆက်မှု ပြန်သုံးနိုင်အောင် ကူညီပါတယ်။ တစ်ခုတည်းသော ပရောက်စီကနေ တောင်းဆိုမှုအများအပြားလုပ်တဲ့ ပရိုဂရမ်မှာ တစ်ခါစီ အသစ်တစ်စုံမဆောက်ဘဲ client နဲ့ transport ကို ထိန်းထားပါ။

client ရဲ့ အချိန်ကန့်သတ်ချက်က ဆော့ကက်ဖွင့်တာတင်မဟုတ်ဘဲ response body ဖတ်တာအပါအဝင် တောင်းဆိုမှုသက်တမ်းကိုပါ ကန့်သတ်ပါတယ်။ Get ပြန်လာပြီးနောက် ဖတ်ရာမှာဖြစ်တဲ့အမှားတွေကိုလည်း ကိုင်တွယ်ရပါမယ်။ 403 လို status ဟာ Go transport အမှား မဟုတ်လို့ StatusCode ကို err နဲ့ သီးခြားစစ်ပါ။

ဆက်စပ်ဆောင်းပါးများ