通过某些错误消息中止我的 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"}
{"Result":"Result","Error":"error message"}
我尝试过log.fatal,os.Exit(1)他们停止了服务,而不仅仅是通话请求。panic中止通话,但阻止我发送http.ResponseWriter这是我的错误消息。
log.fatal
os.Exit(1)
panic
http.ResponseWriter
我读了一些有关 恐慌,推迟,恢复的信息, 但我真的不知道如何使用它们来解决此问题。
return 作品:
return
mobile :=query.Get("mobile") if mobile=="mobile" { str:=`{"Resultt":"","Error":"No valide Var"}` fmt.Fprint(w, str) fmt.Println("No successfull Operation!!") return}
但是我只能在main函数中使用它,因为在其他函数中,它仅退出func而不是调用者函数(请求)。
终止HTTP请求的服务无非是从ServeHTTP()方法中返回,例如:
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错误代码,而不是隐含的default200OK。为此,您可以使用http.Error()函数,例如:
200OK
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 })