如何使用" slashUrls"而不是QueryString。 (没有订购)

时间:2014-12-22 01:47:18

标签: go

我使用gorilla-mux路由我的网址,但我发现了一个难点:

我的客户端更喜欢带斜杠的网址而不是传统的查询字符串。我的意思是:

域/处理/过滤器1 / VAL1 /过滤器2 / VAL2 ...

而不是

域/处理程序过滤器1 = VAL1&安培;过滤器2 = val2的...

重要问题: 使用查询字符串时,'变量'订单并不重要,如果没有错误的路由或NotFound,它们中的任何一个都可能丢失。

使用查询字符串时,' vars'的顺序并不重要,如果没有错误的路由,我可能会错过任何一个 此刻,我正在编写一个排列算法,该算法创建了用于处理具有相同功能的URL的排列。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我写了一个" url生成器"为了我的需要

<强> https://github.com/daniloanp/SlashedQueryUrls

它非常简单和天真,但它为我工作。

使用的一个很好的例子是我的回归:

package main

import (
    "fmt"
    "github.com/daniloanp/muxUrlGen"
    "github.com/gorilla/mux"
    "net/http"
)

func HandleUrlsWithFunc(rtr *mux.Router, urls []string, handler func(w http.ResponseWriter, r *http.Request)) {
    for _, url := range urls {
        rtr.HandleFunc(url, handler)
    }
}

func echoVars(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintln(w, r.URL.String(), "\n\n")
    for k, i := range mux.Vars(r) {
        fmt.Fprintln(w, k, ": ", i)
    }
}

func main() {
    var url string
    var urls []string

    rtr := mux.NewRouter()

    url = "/handl/v1/{v}/v2/{v'}"
    rtr.HandleFunc(url, echoVars)
    // The above code works by we cannot missing any var OR Even

    // Using "long notation"
    urls = muxUrlGen.GetUrlVarsPermutations("/handlLong/v1/{v:[0-9]+}/v2/{v'}", true)
    HandleUrlsWithFunc(rtr, urls, echoVars)

    // Using "long notation" and Optional vars
    urls = muxUrlGen.GetUrlVarsPermutations("/handlLongOptional/v1/{v}?/v2/{v'}?", true)
    HandleUrlsWithFunc(rtr, urls, echoVars)

    // Using "short notation"
    urls = muxUrlGen.GetUrlVarsPermutations("/handlShort/{v1}/{v2}", false)
    HandleUrlsWithFunc(rtr, urls, echoVars)

    // Using "short notation" and Optional vars
    urls = muxUrlGen.GetUrlVarsPermutations("/handlShortOptional/{v1}?/{v2}?", false)
    HandleUrlsWithFunc(rtr, urls, echoVars)

    http.Handle("/", rtr)
    fmt.Println("Server running at http://127.0.0.1:8080")

    http.ListenAndServe(":8080", nil)
}

谢谢大家。