大猩猩mux可选查询值

stassinari:

我一直在从事将大猩猩/多路复用器用作路由器的Go项目。

我需要具有与路由关联的查询值,但是这些值应该是可选的。这意味着,我想她俩/articles/123/articles/123?key=456在相同的处理。

为此,我尝试使用r.Queries接受键/值对的方法:路由器。

  Path("/articles/{id:[0-9]+}").Queries("key", "{[0-9]*?}")

但这仅使value(456)可选,而不使成为可选key因此/articles/123?key=456/articles/123?key=均有效,但无效/articles/123

编辑:另一个要求是,在注册路由之后,我想以编程方式构建它们,r.Queries尽管文档明确指出了可行的方法,我似乎也无法弄清楚如何使用https://github.com / gorilla / mux#registered-urls)。

@jmaloney答案有效,但不允许从名称构建URL。

jmaloney:

我只会给您的处理程序注册两次。

router.Path("/articles/{id:[0-9]+}").
    Queries("key", "{[0-9]*?}").
    HandlerFunc(YourHandler).
    Name("YourHandler")

router.Path("/articles/{id:[0-9]+}").HandlerFunc(YourHandler)

这是一个工作程序进行演示。注意,我r.FormValue用来获取查询参数。

注意:请确保您具有最新版本,go get -u github.com/gorilla/mux因为最近未修复未添加内置URL的查询参数的错误。

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

var router = mux.NewRouter()

func main() {
    router.Path("/articles/{id:[0-9]+}").Queries("key", "{key}").HandlerFunc(YourHandler).Name("YourHandler")
    router.Path("/articles/{id:[0-9]+}").HandlerFunc(YourHandler)

    if err := http.ListenAndServe(":9000", router); err != nil {
        log.Fatal(err)
    }
}

func YourHandler(w http.ResponseWriter, r *http.Request) {
    id := mux.Vars(r)["id"]
    key := r.FormValue("key")

    u, err := router.Get("YourHandler").URL("id", id, "key", key)
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    // Output:
    // /articles/10?key=[key]
    w.Write([]byte(u.String()))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章