我有一个使用Goji的应用程序,并定义了以下路线:
func init() {
mux := web.New()
http.Handle("/api/list", mux)
mux.Use(middleware.EnvInit)
mux.Use(middleware.Logger)
mux.Get( "/api/list", list.HandleListGetAll)
mux.Post("/api/list", list.HandleListNewList)
mux.Get( "/api/list/:id", list.HandleListGetSingle)
}我可以得到并发布到/api/list,但是GETing /api/list/0只会产生一个404,我认为来自Goji本身。
有人知道我做错了什么吗?
发布于 2015-07-18 01:26:08
Goji不返回404 -来自Goji的任何404都应该由Logger中间件记录到控制台(stdout)。向Goji路由器传递请求的上游处理程序正在弹出任何不是/api/list的东西。
您可以通过更宽松的匹配来解决这个问题:
package main
import (
"fmt"
"net/http"
"github.com/zenazn/goji/web"
"github.com/zenazn/goji/web/middleware"
)
func main() {
mux := web.New()
http.Handle("/api/", mux)
mux.Use(middleware.EnvInit)
mux.Use(middleware.Logger)
mux.Get("/api/list/:id", debugHandler)
mux.Get("/api/list", debugHandler)
mux.Post("/api/list", debugHandler)
// If Goji's router 404's, we should call our custom handler, and it
// should also be apparent in the logs.
mux.NotFound(notFoundHandler)
http.ListenAndServe(":8000", nil)
}
func debugHandler(c web.C, w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v\n", r.URL.Path)
}
func notFoundHandler(c web.C, w http.ResponseWriter, r *http.Request) {
http.Error(w, fmt.Sprintf("Goji 404: %s", r.URL.Path), 404)
}请注意,我已经将上游http.Handle更改为http.Handle("/api/", mux),以提供更宽松的匹配。net/http路由器非常简单,因为/api/list/131313 (例如,id)与/api/list不匹配,它在命中您创建的Goji实例之前是404。
希望这能有所帮助。
https://stackoverflow.com/questions/31483787
复制相似问题