Go http:将收到的 HTTP 请求传输到另一台服务器
在服务版本共存的场景下,可能需要复制传入的 HTTP 请求以保持兼容性。本文探讨了一种使用 Go 编程语言将一个服务收到的请求重定向到另一个服务的方法。
挑战:
用户在尝试复制 POST 时遇到问题Go 服务中的请求到单独的服务。设置req.URL.Host和req.Host直接导致错误“http: Request.RequestURI can't be set in client requests.”
解决方案:
推荐的方法是创建一个新的 http.Request 对象并有选择地从原始请求中复制所需的部分。这可确保为第二个请求正确设置 RequestURI。此外,如果需要重用请求正文,则应将其缓冲并分配给新请求的正文。
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 }
这种方法有效地将传入的 HTTP 请求传输到其他服务器,同时尊重 RequestURI 和其他关键 HTTP 参数。
以上是如何在 Go 中将 HTTP 请求转发到另一台服务器?的详细内容。更多信息请关注PHP中文网其他相关文章!