Gorilla Mux相同端点多查询参数

Gorilla Mux相同端点多查询参数,go,query-parameters,mux,Go,Query Parameters,Mux,所以我知道,Gorilla Mux不支持可选的查询参数,人们建议使用查询参数创建不同的路由,这使得查询参数更加可靠。但在我的例子中,没有按照预期解决路由问题 如果我调用/service/{locale}?param1=1,2¶m2=3,4,那么它将调用a.listFirst,而它应该调用a.listsond,并使用其他组合处理相同的问题。但是: 如果我只保留一条路线,那么该路线将按预期工作。所以我假设路线本身是好的,但是当它们在一起的时候会有一些解决问题 如果删除第一条路由(没有查询参数

所以我知道,Gorilla Mux不支持可选的查询参数,人们建议使用查询参数创建不同的路由,这使得查询参数更加可靠。但在我的例子中,没有按照预期解决路由问题

如果我调用
/service/{locale}?param1=1,2¶m2=3,4
,那么它将调用
a.listFirst
,而它应该调用
a.listsond
,并使用其他组合处理相同的问题。但是:

  • 如果我只保留一条路线,那么该路线将按预期工作。所以我假设路线本身是好的,但是当它们在一起的时候会有一些解决问题
  • 如果删除第一条路由(没有查询参数的路由)并交换其余路由的顺序,那么它们都可以正常工作。这意味着顺序也很重要
  • 我知道我可以使用
    request.URL.Query()
    来获取查询参数,但我很想知道为什么这种将查询参数定义为路由的方法不能按预期工作

    a.Router.
        Methods(http.MethodGet).
        Path("/service/{locale}").
        Handler(negroni.New(
            a.contentTypeJSON,
            negroni.HandlerFunc(a.listAll),
        ))
    
    a.Router.
        Methods(http.MethodGet).
        Path("/service/{locale}").
        Queries("param1", "{param1:[0-9,]+}").
        Handler(negroni.New(
            a.contentTypeJSON,
            negroni.HandlerFunc(a.listFirst),
        ))
    
    a.Router.
        Methods(http.MethodGet).
        Path("/service/{locale}").
        Queries("param2", "{param2:[0-9,]+}", "param1", "{param1:[0-9,]+}").
        Handler(negroni.New(
            a.contentTypeJSON,
            negroni.HandlerFunc(a.listSecond),
        ))
    
    我已经看过了,但是它们没有回答问题

    更新

    简短回答:订单问题


    提示:别傻了,使用正确的处理函数

    你必须更改顺序,因为顺序很重要。第一个匹配项被选中

    a.Router.
        Methods(http.MethodGet).
        Path("/service/{locale}").
        Queries("param2", "{param2:[0-9,]+}", "param1", "{param1:[0-9,]+}").
        Handler(negroni.New(
            a.contentTypeJSON,
            negroni.HandlerFunc(a.listSecond),
        ))
    
    a.Router.
        Methods(http.MethodGet).
        Path("/service/{locale}").
        Queries("param1", "{param1:[0-9,]+}").
        Handler(negroni.New(
            a.contentTypeJSON,
            negroni.HandlerFunc(a.listFirst),
        ))
    
    a.Router.
        Methods(http.MethodGet).
        Path("/service/{locale}").
        Handler(negroni.New(
            a.contentTypeJSON,
            negroni.HandlerFunc(a.listAll),
        ))
    

    我建议使用GRPCGO、GRPCGateway,并使用它,您不需要以这种方式定义额外的查询参数。消息中定义的所有内容都可以作为查询参数传递

    路由器通常按照添加的顺序匹配内容,因此排序很重要。这意味着您需要颠倒代码中所有3条路由的顺序。要使事物正常运行,必须首先进行最专业的匹配。这只是一个路由通常是如何工作的假设,因为我没有使用gorilla mux的经验,但如果它没有遵循相同的习惯用法,我会感到惊讶。顺序是正确的,我甚至尝试过,因为它在其他框架中通常是这样工作的,但我在我的原始代码中使用了错误的处理函数,这导致了混乱。