Go HTTP istemcisine kendi proxy’sini atayın
Go’nun varsayılan transport’unu klonlayın, seçilen proxy IP’si için ProxyURL ayarlayın ve diğer istemcilerin davranışını değiştirmeyin.
Go HTTP istemcisinde proxy’yi transport seçer. Varsayılan istemcinin diğer kullanıcıları mevcut rotalarını korusun diye standart transport’u değiştirmeden önce klonlayın.
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)
}
}
Adres, belgelerde kullanılan bir yer tutucudur. Bunu HTTP proxy listesinden seçilen bir aday gibi gerçek bir HTTP proxy IP’si ve portuyla değiştirin. Örnek yalnızca Go standart kitaplığını kullanır; bu HTTP proxy isteği için SOCKS paketi veya süreç genelinde ortam değişkeni gerekmez.
DefaultTransport’u neden doğrudan değiştirmemeli?
Varsayılan transport ortaktır. Değiştirmek, proxy’nizi hiç istememiş kodu etkileyebilir; istekler onu kullanırken değiştirmek de önlenebilir eşzamanlılık sorunları doğurur. Ayrı bir transport, rotayı bu istemcinin yapılandırmasının parçası yapar.
http.ProxyURL her zaman verilen URL’yi seçen bir seçici döndürür. Bu, proxy değişkenlerini ve atlama kurallarını dikkate alan varsayılan ortam seçicisinden farklıdır. Amacınız HTTP listesindeki belirli bir girdiyi test etmekse, açık seçici bu belirsizlik kaynağını ortadan kaldırır.
Yanıtı kapatın, istemciyi yeniden kullanın
Örnek, yanıt gövdesini sonuna kadar okuyup kapatır. Tam okumak, transport’un mümkün olduğunda bağlantıyı yeniden kullanmasına yardımcı olur. Aynı proxy üzerinden birkaç istek gönderen programda her istek için yeni çift oluşturmak yerine istemciyi ve transport’u koruyun.
İstemcinin zaman aşımı yalnızca soketin açılmasını değil, yanıt gövdesinin okunması dahil istek yaşam döngüsünü de sınırlar. Get döndükten sonra da okuma hataları ele alınmalıdır. 403 gibi bir durum Go transport hatası değildir; bu yüzden StatusCode ile err değerlerini ayrı inceleyin.