Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Majukan Permintaan HTTP ke Pelayan Lain Semasa Mengelakkan 'http: Request.RequestURI tidak boleh ditetapkan dalam permintaan klien'?

Bagaimanakah Saya Boleh Majukan Permintaan HTTP ke Pelayan Lain Semasa Mengelakkan 'http: Request.RequestURI tidak boleh ditetapkan dalam permintaan klien'?

Patricia Arquette
Lepaskan: 2024-12-13 21:16:29
asal
907 orang telah melayarinya

How Can I Forward Go HTTP Requests to Another Server While Avoiding

Pergi HTTP: Mengirim semula Permintaan Masuk ke Pelayan Lain

Andaikan anda mempunyai perkhidmatan warisan dan versi ("warisan" dan "version_2_of_doom") berjalan di samping satu sama lain. Anda mahu semua permintaan POST dikendalikan oleh kedua-dua perkhidmatan secara serentak untuk peralihan yang lancar.

Pada mulanya, anda cuba mengubah suai pengendali perkhidmatan warisan untuk menduplikasi permintaan kepada "version_2_of_doom" secara langsung. Walau bagaimanapun, pendekatan ini gagal dengan ralat "http: Request.RequestURI tidak boleh ditetapkan dalam permintaan pelanggan."

Penyelesaian pilihan ialah membuat permintaan baharu dan menyalin hanya bahagian yang diperlukan daripada permintaan masuk. Proses ini menyerupai apa yang dilakukan oleh proksi terbalik, yang boleh anda periksa dalam pakej "net/http/httputil".

Berikut ialah contoh pelaksanaan:

func handler(w http.ResponseWriter, req *http.Request) {
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    req.Body = ioutil.NopCloser(bytes.NewReader(body))

    url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI)

    proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body))

    proxyReq.Header = make(http.Header)
    for h, val := range req.Header {
        proxyReq.Header[h] = val
    }

    resp, err := httpClient.Do(proxyReq)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadGateway)
        return
    }
    defer resp.Body.Close()

    // legacy code
}
Salin selepas log masuk

Pendekatan ini membolehkan anda memilih secara selektif salin pengepala dan buat URI permintaan baharu untuk dihantar ke pelayan lain. Dengan mengikut corak ini, anda boleh memajukan permintaan HTTP masuk ke berbilang perkhidmatan dengan lancar tanpa mengubah butiran permintaan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Majukan Permintaan HTTP ke Pelayan Lain Semasa Mengelakkan 'http: Request.RequestURI tidak boleh ditetapkan dalam permintaan klien'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan