andeya/faygo

如何自定义不存在的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 @