Transport klien HTTP Go memilih proxy. Klon transport standar sebelum mengubahnya agar pengguna lain dari klien bawaan tetap memakai rute yang sudah ada.

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)
    }
}

Alamat tersebut adalah contoh dokumentasi. Ganti dengan IP dan port proxy HTTP sungguhan, misalnya kandidat dari daftar proxy HTTP. Contoh hanya memakai pustaka standar Go; permintaan melalui proxy HTTP ini tidak memerlukan paket SOCKS atau variabel lingkungan untuk seluruh proses.

Mengapa tidak langsung mengubah DefaultTransport?

Transport bawaan dipakai bersama. Mengubahnya bisa memengaruhi kode yang tidak pernah meminta proxy Anda, dan mengubah transport saat sedang digunakan permintaan menimbulkan masalah konkurensi yang bisa dihindari. Transport khusus menjadikan rute bagian dari konfigurasi klien ini.

http.ProxyURL mengembalikan pemilih yang selalu memilih URL yang diberikan. Ini berbeda dari pemilih lingkungan bawaan yang mempertimbangkan variabel proxy dan aturan bypass. Jika Anda ingin menguji satu entri tertentu dari daftar HTTP, pemilih eksplisit menghilangkan sumber ambiguitas tersebut.

Tutup respons dan gunakan kembali klien

Contoh membaca seluruh badan respons lalu menutupnya. Membaca sampai selesai membantu transport memakai kembali koneksi jika memungkinkan. Dalam program dengan beberapa permintaan melalui proxy yang sama, pertahankan klien dan transport alih-alih membuat pasangan baru untuk setiap permintaan.

Batas waktu klien tidak hanya mencakup pembukaan soket, tetapi juga siklus permintaan, termasuk membaca badan respons. Kesalahan baca tetap perlu ditangani setelah Get kembali. Status seperti 403 bukan kesalahan transport Go, jadi periksa StatusCode terpisah dari err.

Artikel terkait