[英]Terminate http request via header error code return or JSON response
如何从Handlefunc调用多个错误返回函数?
我在这个链接中找到了类似于我需要的东西: Golang:终止或中止HTTP请求 。
因此,在某些情况下,我需要返回带有HTTP错误代码的错误响应,如下所示(代码来自上面的链接):
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
})
但是,在某些情况下,我需要向Web客户端返回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
})
问题是:我想将错误处理部分放在一个单独的错误函数中,并将我想要呈现的错误类型作为函数参数/方法传递。 但是我不知道,如何在语义上做到这一点。
所以,在要点:
if isJsonError {
//call HTTP function to serve JSON error
}
if isHTTPError {
//call HTTP function to serve an HTTP error
}
我怎么能在语义上做到这一点? 如果我不清楚,请提前抱歉。 谢谢!
PS:我还阅读了以下博文: http : //blog.golang.org/error-handling-and-go
有一个部分称为“简化重复错误处理” - 它很酷但我需要简化多个重复错误处理,我无法弄清楚如何。
像这样的东西:
func badReq(w http.ResponseWriter, isJson bool, err string) {
if !isJson {
http.Error(w, err, http.StatusBadRequest)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, `{"result":"","error":%q}`, err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if !ok {
badReq(w, true, "no valid var")
return
}
})
自定义处理程序方法(根据博客文章) - 带有func(w http.ResponseWriter, r *http.Request) error
签名当然是一个很好的方法。 您可以返回&HTTPError{err, code}
或&JSONError{err, code}
并让ServeHTTP
检查并正确呈现。 例如
type Handler struct {
h func(http.ResponseWriter, *http.Request) error
}
func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Execute the handler function
err := h.h(w, r)
if err != nil {
switch e := err.(type) {
case *HTMLError:
// Render a HTML response, calling e.Err and e.Code
case *JSONError:
// Render a JSON response
default:
// Handle all other 'generic' errors you don't inspect
}
}
}
type HTMLError struct {
Err error
Code int
}
func (e *HTMLError) Error() string {
return e.Err.Error()
}
type JSONError struct {
Err error
Code int
}
func (e *JSONError) Error() string {
return e.Err.Error()
}
func SomeHandler(w http.ResponseWriter, r *http.Request) error {
// examine incoming params
if !ok {
// Your returns are also enforced here - avoiding subtle bugs
return &HTTPError{errors.New("No good!"), http.StatusBadRequest}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.