繁体   English   中英

通过标头错误代码返回或JSON响应终止http请求

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM