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