英文:
httprouter configuring NotFound
问题
我正在使用httprouter
来构建一个API,并且我正在尝试解决如何处理404错误的问题。在文档中确实提到可以手动处理404错误,但我不太清楚如何编写自己的自定义处理程序。
我在其他路由之后尝试了以下代码...
router.NotFound(pageNotFound)
但是我得到了错误信息not enough arguments in call to router.NotFound
。
如果有人能指点我正确的方向,那就太好了。
英文:
I'm using httprouter
for an API and I'm trying to work out how to handle 404s. It does say in the docs that 404's can be handled manually but I don't really have an idea how to write my own custom handler.
I've tried the following after my other routes...
router.NotFound(pageNotFound)
But I get the error not enough arguments in call to router.NotFound
.
If anyone could point me in the right direction it would be great.
答案1
得分: 9
httprouter.Router
类型是一个 struct
,它有一个字段:
NotFound http.Handler
所以 NotFound
的类型是 http.Handler
,它是一个接口类型,只有一个方法:
ServeHTTP(ResponseWriter, *Request)
如果你想要自定义自己的 "Not Found" 处理程序,你需要设置一个实现了这个接口的值。
最简单的方法是定义一个具有以下签名的函数:
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 = ... // 你的路由器值
router.NotFound = http.HandlerFunc(MyNotFound)
这个 NotFound
处理程序将由 httprouter
包调用。如果你想要在其他处理程序中手动调用它,你需要传递一个 ResponseWriter
和一个 *Request
,类似这样:
func ResourceHandler(w http.ResponseWriter, r *http.Request) {
exists := ... // 查看请求的资源是否有效和可用
if !exists {
MyNotFound(w, r) // 传递 ResponseWriter 和 Request
// 或者通过 Router:
// router.NotFound(w, r)
return
}
// 资源存在,提供服务
// ...
}
英文:
The type httprouter.Router
is a struct
which has a field:
NotFound http.Handler
So type of NotFound
is http.Handler
, an interface type which has a single method:
ServeHTTP(ResponseWriter, *Request)
If you want your own custom "Not Found" handler, you have to set a value that implements this interface.
The easiest way is to define a function with signature:
func(http.ResponseWriter, *http.Request)
And use the http.HandlerFunc()
helper function to "convert" it to a value that implements the http.Handler
interface, whose ServeHTTP()
method simply calls the function with the above signature.
For example:
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)
This NotFound
handler will be invoked by the httprouter
package. If you would want to call it manually from one of your other handlers, you would have to pass a ResponseWriter
and a *Request
to it, something like this:
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
// ...
}
答案2
得分: 1
NotFound是一个类型为http.HandlerFunc的函数指针。你需要定义一个具有Func(w ResponseWriter, r *Request)
签名的函数,并将其赋值给NotFound(router.NotFound = Func
)。
英文:
NotFound is a function pointer of type http.HandlerFunc. You will have to put a function with the signature Func(w ResponseWriter, r *Request)
somewhere and assign it to NotFound (router.NotFound = Func
).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论