Golang中如何显示HTTP请求的错误响应 - 已解决

Golang中如何显示HTTP请求的错误响应 - 已解决 以下是我的Web服务器中的一个函数。

func tgetfiles(w http.ResponseWriter, r *http.Request) {

	if err := r.ParseForm(); err != nil {
		fmt.Fprintf(w, "ParseForm() err: %v", err)
		return
	}
	APIKEY := r.FormValue("APIKEY")
	TASK := r.FormValue("TASK")
	enableCors(&w)

当另一端的API返回404时,它会返回XML,但这只会显示文件未找到。

这是Web服务器部分。

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "API Brdige for Proclaim")
	})


	http.HandleFunc("/test/workflow", tworkflows)
	http.HandleFunc("/test/status", tstatus)
	http.HandleFunc("/test/engineer", tengineer)
	http.HandleFunc("/test/bookengineer", tbengineer)

如何让它显示来自API服务器的XML?


更多关于Golang中如何显示HTTP请求的错误响应 - 已解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何显示HTTP请求的错误响应 - 已解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在您的tgetfiles函数中,您需要捕获从API服务器返回的响应,包括状态码和响应体。当API返回404时,您应该将接收到的XML响应直接返回给客户端,而不是仅显示"文件未找到"。

以下是修改后的代码示例:

func tgetfiles(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        fmt.Fprintf(w, "ParseForm() err: %v", err)
        return
    }
    APIKEY := r.FormValue("APIKEY")
    TASK := r.FormValue("TASK")
    enableCors(&w)

    // 构建API请求
    apiURL := "您的API端点URL"
    req, err := http.NewRequest("GET", apiURL, nil)
    if err != nil {
        http.Error(w, fmt.Sprintf("创建请求失败: %v", err), http.StatusInternalServerError)
        return
    }

    // 添加必要的头部
    req.Header.Add("APIKEY", APIKEY)
    // 添加其他必要的头部参数

    // 发送请求
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        http.Error(w, fmt.Sprintf("API请求失败: %v", err), http.StatusInternalServerError)
        return
    }
    defer resp.Body.Close()

    // 设置与API响应相同的状态码
    w.WriteHeader(resp.StatusCode)

    // 设置内容类型为XML
    w.Header().Set("Content-Type", "application/xml")

    // 将API响应体直接复制到响应写入器
    _, err = io.Copy(w, resp.Body)
    if err != nil {
        http.Error(w, fmt.Sprintf("复制响应失败: %v", err), http.StatusInternalServerError)
        return
    }
}

如果您已经有一个处理API调用的函数,可以这样修改:

func callAPI(apiURL string) (*http.Response, error) {
    resp, err := http.Get(apiURL)
    if err != nil {
        return nil, err
    }
    return resp, nil
}

func tgetfiles(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        fmt.Fprintf(w, "ParseForm() err: %v", err)
        return
    }
    APIKEY := r.FormValue("APIKEY")
    TASK := r.FormValue("TASK")
    enableCors(&w)

    // 调用API
    apiURL := "您的API端点URL"
    resp, err := callAPI(apiURL)
    if err != nil {
        http.Error(w, fmt.Sprintf("API调用失败: %v", err), http.StatusInternalServerError)
        return
    }
    defer resp.Body.Close()

    // 设置状态码和内容类型
    w.WriteHeader(resp.StatusCode)
    w.Header().Set("Content-Type", resp.Header.Get("Content-Type"))

    // 转发响应体
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        http.Error(w, fmt.Sprintf("读取响应失败: %v", err), http.StatusInternalServerError)
        return
    }
    w.Write(body)
}

这样,当API服务器返回404状态码和XML响应时,您的Web服务器会将相同的状态码和XML内容返回给客户端。

回到顶部