Pergi http: Memindahkan Permintaan HTTP yang Diterima ke Pelayan Lain
Dalam senario di mana versi perkhidmatan wujud bersama, permintaan HTTP yang masuk mungkin perlu diduplikasi untuk mengekalkan keserasian. Artikel ini meneroka kaedah untuk mengubah hala permintaan yang diterima oleh satu perkhidmatan kepada perkhidmatan yang lain menggunakan bahasa pengaturcaraan Go.
Cabaran:
Seorang pengguna menghadapi masalah semasa cuba menduplikasi POST permintaan dalam perkhidmatan Go ke perkhidmatan berasingan. Menetapkan req.URL.Host dan req.Host secara langsung mengakibatkan ralat "http: Request.RequestURI tidak boleh ditetapkan dalam permintaan pelanggan."
Penyelesaian:
Pendekatan yang disyorkan adalah untuk mencipta objek http.Request baharu dan secara terpilih menyalin bahagian yang dikehendaki daripada permintaan asal. Ini memastikan RequestURI ditetapkan dengan betul untuk permintaan kedua. Selain itu, jika badan permintaan perlu digunakan semula, ia hendaklah ditimbal dan ditetapkan pada badan permintaan baharu.
Contoh Kod Go:
func handler(w http.ResponseWriter, req *http.Request) { // Buffer the body for reuse body, err := ioutil.ReadAll(req.Body) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } req.Body = ioutil.NopCloser(bytes.NewReader(body)) // Construct a new request with the desired URL and body proxyScheme := "http" proxyHost := "example.com" url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI) proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body)) // Copy essential headers proxyReq.Header = make(http.Header) for h, val := range req.Header { proxyReq.Header[h] = val } // Send the request to the other server resp, err := httpClient.Do(proxyReq) if err != nil { http.Error(w, err.Error(), http.StatusBadGateway) return } defer resp.Body.Close() // Handle the response as usual }
Pendekatan ini memindahkan permintaan HTTP masuk ke pelayan lain dengan berkesan sambil menghormati RequestURI dan parameter HTTP kritikal yang lain.
Atas ialah kandungan terperinci Bagaimana untuk Memajukan Permintaan HTTP ke Pelayan Lain dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!