如何中止我的API服务与一些错误消息?
链接调用我的服务:
http://creative.test.spoti.io/api/getVastPlayer?add=
{"Json":Json}&host=api0.spoti.io&domain=domain&userAgent=userAgent&mobile=true
要调用我的服务,客户端需要发送一个Json和一些参数。
我想测试我得到的参数是否正确,如果不正确,我想发送一个错误消息。
响应应该是Json Code {"Result":"Result","Error":"error message"}
我尝试了log.fatal
和os.Exit(1)
,他们停止了服务,而不仅仅是呼叫请求。panic
中止调用,但它阻止我发送http.ResponseWriter
,这是我的错误信息。
我读了一些关于panic, defer, recover的内容,但是我真的不知道如何使用它们来解决这个问题。
return
works:
mobile :=query.Get("mobile")
if mobile=="mobile" {
str:=`{"Resultt":"","Error":"No valide Var"}`
fmt.Fprint(w, str)
fmt.Println("No successfull Operation!!")
return}
但是我可以在主函数中使用它,因为在其他函数中它只是退出函数而不是调用函数(请求)。
终止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
})
示例显示如何传播"return "
如果在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,如何从另一个函数返回函数?