httprouter配置NotFound

时间:2015-05-28 07:47:35

标签: http go url-routing

我正在使用httprouter获取API,而我正在尝试解决如何处理404问题。它确实在docs中说404可以手动处理,但我真的不知道如何编写我自己的自定义处理程序

我在其他路线之后尝试了以下内容......

router.NotFound(pageNotFound)

但我收到错误not enough arguments in call to router.NotFound

如果有人能指出我正确的方向,那就太好了。

2 个答案:

答案 0 :(得分:7)

httprouter.Router类型是struct,其字段为:

NotFound http.Handler

因此NotFound的类型是http.Handler,这是一种具有单一方法的接口类型:

ServeHTTP(ResponseWriter, *Request)

如果你想要自己的定制" Not Found" handler,你必须设置一个实现这个接口的值。

最简单的方法是定义一个带签名的函数:

func(http.ResponseWriter, *http.Request)

并使用http.HandlerFunc()辅助函数来"转换"它是一个实现http.Handler接口的值,其ServeHTTP()方法只是使用上述签名调用该函数。

例如:

func MyNotFound(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    w.WriteHeader(http.StatusNotFound) // StatusNotFound = 404
    w.Write([]byte("My own Not Found handler."))
    w.Write([]byte(" The page you requested could not be found."))
}

var router *httprouter.Router = ... // Your router value
router.NotFound = http.HandlerFunc(MyNotFound)

NotFound包将调用此httprouter处理程序。如果您想要从其他处理程序手动调用它,则必须将ResponseWriter*Request传递给它,如下所示:

func ResourceHandler(w http.ResponseWriter, r *http.Request) {
    exists := ... // Find out if requested resource is valid and available
    if !exists {
        MyNotFound(w, r) // Pass ResponseWriter and Request
        // Or via the Router:
        // router.NotFound(w, r)
        return
    }

    // Resource exists, serve it
    // ...
}

答案 1 :(得分:1)

NotFound是http.HandlerFunc类型的函数指针。您必须在某处放置一个带有签名Func(w ResponseWriter, r *Request)的函数,并将其分配给NotFound(router.NotFound = Func)。