Transport klien HTTP Go memilih proksi. Klon transport standard sebelum mengubahnya supaya pengguna lain bagi klien lalai mengekalkan laluan sedia 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 itu ialah pemegang tempat dokumentasi. Gantikannya dengan IP dan port proksi HTTP sebenar, misalnya calon daripada senarai proksi HTTP. Contoh hanya menggunakan pustaka standard Go; permintaan proksi HTTP ini tidak memerlukan pakej SOCKS atau pemboleh ubah persekitaran untuk seluruh proses.

Mengapa tidak mengubah DefaultTransport secara terus?

Transport lalai dikongsi. Mengubahnya boleh mempengaruhi kod yang tidak pernah meminta untuk menggunakan proksi anda, dan perubahan ketika permintaan sedang menggunakannya menimbulkan masalah keserentakan yang boleh dielakkan. Transport khusus menjadikan laluan sebahagian daripada konfigurasi klien ini.

http.ProxyURL mengembalikan pemilih yang sentiasa memilih URL yang diberikan. Ini berbeza daripada pemilih persekitaran lalai yang mengambil kira pemboleh ubah proksi dan peraturan pintasan. Jika anda mahu menguji satu entri tertentu dalam senarai HTTP, pemilih eksplisit menghapuskan sumber kekaburan itu.

Tutup respons dan guna semula klien

Contoh membaca seluruh badan respons lalu menutupnya. Membaca hingga selesai membantu transport menggunakan semula sambungan apabila boleh. Dalam program dengan beberapa permintaan melalui proksi yang sama, kekalkan klien dan transport daripada membina pasangan baharu untuk setiap permintaan.

Had masa klien bukan sahaja meliputi pembukaan soket, malah mengehadkan kitaran hayat permintaan, termasuk pembacaan badan respons. Ralat bacaan masih perlu dikendalikan selepas Get kembali. Status seperti 403 bukan ralat transport Go, jadi periksa StatusCode secara berasingan daripada err.

Artikel berkaitan