定义了一个带有绑定参数但得到 404 的 Goji 路由
Defined a Goji route with bound parameter but getting 404
我有一个使用 Goji 的 Google App Engine 应用程序并定义了以下路由:
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)
}
我可以 GET 和 POST 到 /api/list 但是 GETing /api/list/0 只会导致 404,我认为来自 Goji 本身。
有谁知道我做错了什么吗?
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 mux 实例之前就已是 404。
希望对您有所帮助。
我有一个使用 Goji 的 Google App Engine 应用程序并定义了以下路由:
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)
}
我可以 GET 和 POST 到 /api/list 但是 GETing /api/list/0 只会导致 404,我认为来自 Goji 本身。
有谁知道我做错了什么吗?
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 mux 实例之前就已是 404。
希望对您有所帮助。