【问题标题】:Terminating or aborting an HTTP request终止或中止 HTTP 请求
【发布时间】:2026-01-05 09:20:08
【问题描述】:

有什么方法可以中止我的 API 服务并显示一些错误消息?

调用我的服务的链接:

http://creative.test.spoti.io/api/getVastPlayer?add=
    {"Json":Json}&host=api0.spoti.io&domain=domain&userAgent=userAgent&mobile=true

要调用我的服务,客户端需要发送一个 Json 和一些参数。

我想测试我得到的参数是否正确,如果不正确,我想发送错误消息。

响应应该是Json代码{"Result":"Result","Error":"error message"}

我试过log.fatalos.Exit(1) 他们停止服务,而不仅仅是呼叫请求。 panic 中止呼叫,但它阻止我发送 http.ResponseWriter 这是我的错误消息。

我读过一些关于panic, defer, recovery的文章,但我真的不知道如何使用它们来解决这个问题。

return 工作:

mobile :=query.Get("mobile")
if mobile=="mobile" {
            str:=`{"Resultt":"","Error":"No valide Var"}`
            fmt.Fprint(w, str)      
            fmt.Println("No successfull Operation!!")
            return}  

但我可以只在主函数中使用它,因为在其他函数中它只退出 f​​unc 而不是调用者函数(请求)。

【问题讨论】:

    标签: http go error-handling exit abort


    【解决方案1】:

    终止一个HTTP请求的服务无非是从ServeHTTP()方法返回,例如:

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // examine incoming params
        if !ok {
            str := `{"Result":"","Error":"No valide Var"}`
            fmt.Fprint(w, str)
            return
        }
    
        // Do normal API serving
    })
    
    panic(http.ListenAndServe(":8080", nil))
    

    注意事项:

    如果您的 API 服务的输入参数无效,您应该考虑返回 HTTP 错误代码,而不是隐含的默认 200 OK。为此,您可以使用http.Error() 函数,例如:

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // examine incoming params
        if !ok {
            http.Error(w, `Invalid input params!`, http.StatusBadRequest) 
            return
        }
    
        // Do normal API serving
    })
    

    对于一个更复杂的示例,您可以将 JSON 数据连同错误代码一起发回:

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // examine incoming params
        if !ok {
            w.Header().Set("Content-Type", "application/json")
            w.WriteHeader(http.StatusBadRequest)
            str := `{"Result":"","Error":"No valide Var"}`
            fmt.Fprint(w, str)
            return
        }
    
        // Do normal API serving
    })
    

    展示如何传播“回归”的示例

    如果在ServeHTTP() 之外检测到错误,例如在从ServeHTTP() 调用的函数中,您必须返回此错误状态,以便ServeHTTP() 可以返回。

    假设您有以下自定义类型的所需参数和一个负责从请求中解码它们的函数:

    type params struct {
        // fields for your params 
    }
    
    func decodeParams(r *http.Request) (*params, error) {
        p := new(params)
        // decode params, if they are invalid, return an error:
    
        if !ok {
            return nil, errors.New("Invalid params")
        }
    
        // If everything goes well:
        return p, nil
    }
    

    使用这些:

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        p, err := decodeParams(r)
        if err != nil {
            http.Error(w, `Invalid input params!`, http.StatusBadRequest)
            return
        }
    
        // Do normal API serving
    })
    

    另请参阅此相关问题:Golang, how to return in func FROM another func?

    【讨论】:

    • 是的,我说main函数没问题,但是对于其他函数它不起作用,因为return只退出函数而不是HTTP请求。跨度>
    • @Aziz 然后你必须将此错误状态返回给ServeHTTP(),以便它可以返回。请参阅已编辑的答案,其中显示了一个示例。