ホームページ >バックエンド開発 >Golang >Go で HTTP リクエストを別のサーバーに転送するにはどうすればよいですか?

Go で HTTP リクエストを別のサーバーに転送するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-01 22:45:13252ブラウズ

How to Forward HTTP Requests to Another Server in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。