google-app-engine - 定义了一个带有绑定(bind)参数但得到 404 的 Goji 路由

标签 google-app-engine go goji

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

希望对您有所帮助。

关于google-app-engine - 定义了一个带有绑定(bind)参数但得到 404 的 Goji 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31483787/

相关文章:

google-app-engine - google app engine go datastore 使用 key 检查实体是否存在

go - 在 golang 中发布数据后将用户重定向回相同的 URL

Go应用程序文件/包结构

go - 监听 TCP4 而不是 TCP6

https - 戈朗 : Right way to serve both http & https from Go web app with Goji?

java - 如何防止 Jetty/GAE 为不同的上下文路径创建新 session ?

python - GAE : from RDBMS to NDB problems

testing - 以编程方式调用 go 测试

go - 在 Goji 中映射所有路由及其 http 方法

python - 如何从模式中获取文本并将其插入电子邮件正文?