我有一个使用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)
}

我可以从Goji本身获取和发布到/ api / list,但是获取/ api / list / 0只会生成404。

有人知道我在做什么错吗?

最佳答案

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)与404的/api/list不匹配,甚至还没有达到您创建的Goji Mux实例。

希望能有所帮助。

10-04 20:00