首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >httprouter配置NotFound

httprouter配置NotFound
EN

Stack Overflow用户
提问于 2015-05-28 07:47:34
回答 2查看 2.2K关注 0票数 4

我正在使用httprouter作为API,我正在努力研究如何处理404。它确实在文档中说,404可以手动处理,但我真的不知道如何编写自己的自定义处理程序

在我的其他路线之后我试过以下几种方法..。

代码语言:javascript
复制
router.NotFound(pageNotFound)

但是我得到了错误not enough arguments in call to router.NotFound

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-28 07:57:11

httprouter.Router类型是一个struct,它有一个字段:

代码语言:javascript
复制
NotFound http.Handler

因此,NotFound的类型是http.Handler,一种只有一个方法的接口类型:

代码语言:javascript
复制
ServeHTTP(ResponseWriter, *Request)

如果您希望自己的自定义“未找到”处理程序,则必须设置一个实现此接口的值。

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

代码语言:javascript
复制
func(http.ResponseWriter, *http.Request)

并使用http.HandlerFunc()助手函数将其“转换”为实现http.Handler接口的值,其ServeHTTP()方法只需使用上面的签名调用该函数。

例如:

代码语言:javascript
复制
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传递给它,如下所示:

代码语言:javascript
复制
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
    // ...
}
票数 9
EN

Stack Overflow用户

发布于 2015-05-28 07:57:32

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30500322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档