终止或中止 HTTP 请求

Terminating or aborting an HTTP request

如何中止我的 API 服务并出现一些错误消息?

Link 调用我的服务:

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、recover 的内容,但我真的不知道如何使用它们来解决这个问题。

return 有效:

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

但我只能在主函数中使用它,因为在其他函数中它只退出函数而不是调用函数(请求)。

终止 HTTP 请求的服务无非是 return 来自 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 服务的输入参数无效,您应该考虑 return 使用 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
})

显示如何传播的示例"returning"

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

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

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
})

另请参阅此相关问题: