猿问

gorilla/mux 请求与 URL 模式不匹配

我正在访问我前段时间编写的简单网络服务器的一些旧代码,我的请求模式不再有效。我有一个初始化我的路由的函数,如下所示:


func (a *App) InitializeRoutes() {

    a.Router.HandleFunc("/api/forecast/detailed?city={city}&state={state}&period={period}", a.DetailedForecast).Methods("GET")

    a.Router.HandleFunc("/api/forecast/detailed?city={city}&state={state}", a.DetailedForecast).Methods("GET")

    a.Router.HandleFunc("/api/forecast/detailed?random", a.RandomDetailedForecast).Methods("GET")

    a.Router.HandleFunc("/api/forecast/hourly?city={city}&state={state}&hours={hours}", a.HourlyForecast).Methods("GET")

    a.Router.HandleFunc("/api/forecast/hourly?city={city}&state={state}", a.HourlyForecast).Methods("GET")

    a.Router.NotFoundHandler = http.HandlerFunc(a.Custom404Handler)

}

我的自定义 404 处理程序只返回一个 {"error": "Not Found"} 的 json


从这里开始,我在我的应用程序的初始化函数(底部 3 行)结束时初始化这些路由:


func (a *App) Initialize() {

    var err error

    conf.configure()

    sqlDataSource := fmt.Sprintf(

        "postgres://%s:%s@%s:%s/%s?sslmode=disable",

        conf.sqlUsername,

        conf.sqlPassword,

        conf.sqlHost,

        conf.sqlPort,

        conf.sqlDbName)

    a.DB, err = sql.Open("postgres", sqlDataSource)

    if err != nil {

        log.Fatal(err)

    }

    a.Redis = redis.NewClient(&redis.Options{

        Addr:     fmt.Sprintf("%s:%s", conf.redisHost, conf.redisPort),

        Password: conf.redisPassword,

        DB:       conf.redisDb,

    })

    a.Router = mux.NewRouter()

    a.Logger = handlers.CombinedLoggingHandler(os.Stdout, a.Router)

    a.InitializeRoutes()

}

我的应用程序在以下功能上运行:


func (a *App) Run() {

    port := fmt.Sprintf(":%s", os.Getenv("SERVER_PORT"))

    log.Fatal(http.ListenAndServe(port, a.Logger))

}

我的服务器运行在:


func main() {

    a := App{}

    a.Initialize()

    a.Run()

}

当我尝试向我所知的有效 URL 模式发出请求时,我得到以下信息:


>>> import requests

>>> r = requests.get("http://localhost:8000/api/forecast/detailed?city=Chicago&state=IL")

>>> r

<Response [404]>

>>> r.json()

{'error': 'Not Found'}


不负相思意
浏览 108回答 1
1回答

至尊宝的传说

从自述文件...要匹配您需要使用的查询r := mux.NewRouter()...r.Queries("key", "value")匹配 PathPrefixr.PathPrefix("/products/")我认为您需要将这两者结合起来才能实现您想要的。
随时随地看视频慕课网APP

相关分类

Go
我要回答