首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gorilla mux可选查询值

Gorilla mux可选查询值
EN

Stack Overflow用户
提问于 2017-07-29 00:42:09
回答 3查看 46.9K关注 0票数 26

我一直在做一个Go项目,其中使用gorilla/mux作为路由器。

我需要能够将查询值与路由相关联,但这些值应该是可选的。这意味着我希望在同一个处理程序中同时捕获/articles/123/articles/123?key=456

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

代码语言:javascript
复制
  Path("/articles/{id:[0-9]+}").Queries("key", "{[0-9]*?}")

但是这使得只有值(456)是可选的,而不是key。所以/articles/123?key=456/articles/123?key=都是有效的,但/articles/123无效。

编辑:另一个要求是,在注册路由之后,我想以编程的方式构建它们,即使文档中明确指出可以使用(https://github.com/gorilla/mux#registered-urls),我似乎也不知道如何使用r.Queries

@jmaloney answer可以工作,但不允许从名称构建URL。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-29 00:47:39

我只会给你的管理员注册两次。

代码语言:javascript
复制
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的错误。

代码语言:javascript
复制
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()))
}
票数 29
EN

Stack Overflow用户

发布于 2017-07-29 02:25:16

如果注册查询参数,则这些参数是必需的doc

路由中定义的所有变量都是必填项,并且它们的值必须符合相应的模式。

因为这些参数是可选的,所以您只需要在处理程序函数id, found := mux.Vars(r)["id"]中检查它们。其中found将显示查询中是否包含该参数。

票数 13
EN

Stack Overflow用户

发布于 2020-12-01 10:32:23

似乎处理可选URL参数的最好方法是在没有URL参数的情况下正常定义路由器,然后像这样解析出可选参数:

代码语言:javascript
复制
urlParams := request.URL.Query()

这将返回一个映射,其中包含以键/值对形式存在的URL参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45378566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档