Go에서 들어오는 HTTP 요청을 다른 서버로 전달
서비스를 마이그레이션하는 과정에서 요청을 다른 버전으로 전달해야 하는 경우가 많습니다. 응용 프로그램의. 이는 들어오는 HTTP 요청을 복사하여 원하는 대상으로 전송함으로써 달성할 수 있습니다.
그러나 req.URL.Host 및 req.Host를 사용하여 원래 요청을 직접 전달하려고 시도하면 "http" 오류가 발생합니다. : Request.RequestURI는 클라이언트 요청에 설정할 수 없습니다." 이를 극복하려면 보다 포괄적인 접근 방식이 필요합니다.
한 가지 효과적인 방법은 net/http/httputil에서 예시되는 역방향 프록싱 원리를 활용하는 것입니다. 새 요청을 생성하고 필요한 부분을 선택적으로 복사함으로써 요청을 효과적으로 전달할 수 있습니다.
다음은 구현 예입니다.
func handler(w http.ResponseWriter, req *http.Request) { // Buffer the request body to preserve its contents 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 the target URL from the original request url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI) // Create the new request with the modified URL and buffered body proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body)) // Selectively copy relevant headers proxyReq.Header = make(http.Header) for h, val := range req.Header { proxyReq.Header[h] = val } // Execute the request through the HTTP client resp, err := httpClient.Do(proxyReq) if err != nil { http.Error(w, err.Error(), http.StatusBadGateway) return } defer resp.Body.Close() // Forward the response back to the original request }
이 접근 방식을 사용하면 수신 HTTP를 효율적으로 전달할 수 있습니다. 여러 대상에 대한 요청을 처리하므로 서비스 마이그레이션이나 요청 리디렉션이 필요한 기타 시나리오 중에 원활한 전환이 가능합니다.
위 내용은 Go에서 들어오는 HTTP 요청을 다른 서버로 어떻게 전달할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!