Go HTTP клиентэд тусдаа прокси тохируулах
Go-ийн анхны transport-ыг хуулж, сонгосон прокси IP-д ProxyURL тохируулан бусад клиентийн прокси үйлдлийг өөрчлөхөөс зайлсхий.
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-ээс тусад нь шалга.