package server import ( "bytes" "encoding/json" "godo/libs" "io" "log" "net/http" ) func ForwardHandler(w http.ResponseWriter, r *http.Request, reqBody interface{}, url string, headers map[string]string, method string) { payloadBytes, err := json.Marshal(reqBody) if err != nil { libs.ErrorMsg(w, "Error marshaling payload") return } // 创建POST请求,复用原始请求的上下文(如Cookies) req, err := http.NewRequestWithContext(r.Context(), method, url, bytes.NewBuffer(payloadBytes)) if err != nil { libs.ErrorMsg(w, "Failed to create request") return } for key, value := range headers { req.Header.Set(key, value) } //req.Header.Set("Content-Type", "application/json") // 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { libs.ErrorMsg(w, "Failed to send request") return } defer resp.Body.Close() // 将外部服务的响应内容原封不动地转发给客户端 for k, v := range resp.Header { for _, value := range v { w.Header().Add(k, value) } } w.WriteHeader(resp.StatusCode) //log.Printf("resp.Body: %v", resp.Body) _, err = io.Copy(w, resp.Body) if err != nil { // 如果Copy过程中出错,尝试发送一个错误响应给客户端 http.Error(w, "Error forwarding response", http.StatusInternalServerError) log.Printf("Error forwarding response body: %v", err) return } }