如何自定义不存在的api
Closed this issue · 7 comments
例如,当访问到不存在的api时,返回特定的json。net/http中只要HandlerFunc("/")同时另外HandlerFunc已存在的地址就行了。
你指的应该是404返回的内容吧,调用faygo. SetErrorFunc函数来设置
https://github.com/henrylee2cn/faygo/blob/master/faygo.go#L203
可以仿照默认的来定义自己的
https://github.com/henrylee2cn/faygo/blob/master/faygo.go#L497
不是,我指的是类似于"泛地址"
例如,在/api/下,有/api/a /api/b /api/c 等若干指定的handlefunc,但是我还希望处理未指定的。
路由规则:/api/:any
在Handler.Serve中通过ctx.PathParam("any"),获取这段路径,如a、b、c,通过switch来决定执行逻辑。
这样的话会导致switch分支庞大。
有没有考虑过类似于http的handleFunc行为。
可能我没明白你的意思。如果你可以用http标准包实现,那么faygo也肯定是可以的。或者你可以把你的http代码示例写一下,然后我翻译个faygo版本的
如下代码
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
fmt.Fprintf(w, "return @")
})
http.HandleFunc("/a", func(w http.ResponseWriter, r *http.Request){
fmt.Fprintf(w, "return a")
})
http.HandleFunc("/99", func(w http.ResponseWriter, r *http.Request){
fmt.Fprintf(w, "return 99")
})
http.ListenAndServe(":8888", nil)
}
访问/a
显示return a
访问/99
显示return 99
访问/111
以及其他未handle的path,显示return @
由于faygo采用httprouter路由,规则如下:
Pattern: /test/x
/test/ no match
Pattern: /test/*x
/test/ match
/test/a match
/test/b/c match
因此,需要使用迂回策略实现你的需求:
type CatchAll map[string]faygo.Handler
func (c CatchAll) GET(pattern string, handlerFunc faygo.Handler) {
c[pattern] = handlerFunc
}
func (c CatchAll) Serve(ctx *faygo.Context) error {
h, ok := c[ctx.Path()]
if ok {
return h.Serve(ctx)
}
return ctx.String(200, "return @")
}
func main() {
var app = faygo.New("newapp")
defer faygo.Run()
catchAll := make(CatchAll)
app.GET("/test/*x", catchAll)
catchAll.GET("/test/a", faygo.HandlerFunc(func(ctx *faygo.Context) error {
return ctx.String(200, "return a")
}))
catchAll.GET("/test/99", faygo.HandlerFunc(func(ctx *faygo.Context) error {
return ctx.String(200, "return 99")
}))
}
访问/test/a
显示return a
访问/test/99
显示return 99
访问/test/111
以及其他未handle的path,显示return @