Go http: 受信した HTTP リクエストを別のサーバーに転送する
サービス バージョンが共存するシナリオでは、受信 HTTP リクエストを複製する必要がある場合があります互換性を維持するため。この記事では、Go プログラミング言語を使用して、あるサービスで受信したリクエストを別のサービスにリダイレクトする方法について説明します。
課題:
POST を複製しようとしたときに、ユーザーが問題に直面しました。 Go サービス内のリクエストを別のサービスに送信します。 req.URL.Host と req.Host を直接設定すると、「http: Request.RequestURI をクライアント リクエストに設定できません。」というエラーが発生しました。
解決策:
推奨されるアプローチは、新しい http.Request オブジェクトを作成し、元のリクエストから必要な部分を選択的にコピーすることです。これにより、RequestURI が 2 番目のリクエストに対して適切に設定されるようになります。さらに、リクエスト本文を再利用する必要がある場合は、バッファリングして新しいリクエストの本文に割り当てる必要があります。
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 }
このアプローチでは、RequestURI およびその他の重要な HTTP パラメーターを尊重しながら、受信した HTTP リクエストを他のサーバーに効果的に転送します。
以上がGo で HTTP リクエストを別のサーバーに転送するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。