如何在Golang路由中将URL作为参数传递?

时间:2017-04-26 13:30:41

标签: http url go routes gorilla

我正在尝试在Golang中传递一个URL作为参数,但我还没有找到我所看过的所有教程中的解决方案。问题是我只能获得返回的网址减去一个关键的正斜杠。

我的处理程序如下所示:

router.HandleFunc("/new/{url}", createURL)

所以请求看起来像是:

www.myapp.heroku.com/new/https://www.google.com

但是,我得到的网址缺少斜杠:

http:/www.google.com

我确定它可能与RFC3986有关,但是有没有办法传入url呢?

2 个答案:

答案 0 :(得分:2)

阅读the other question后,我明白你的意思。在URL转到gorilla/mux之前实现一种URL重写。该功能如下:

func Rewriter(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        //Simple URL rewriter. Rewrite if it's started with API path
        pathReq := r.RequestURI
        if strings.HasPrefix(pathReq, "/new/") {
            //Use url.QueryEscape for pre go1.8
            pe := url.PathEscape(strings.TrimLeft(pathReq, "/new/"))
            r.URL.Path = "/new/" + pe
            r.URL.RawQuery = ""
        }

        h.ServeHTTP(w, r)
    })
}

启动http服务器时包裹大猩猩路由器:

r := mux.NewRouter()

// ... other handler
r.HandleFunc("/new/{original-url}", NewHandler)

//Wrap mux.Router using Rewriter
log.Fatal(http.ListenAndServe(":8080", Rewriter(r)))

然后在URL shortener处理程序中,可以使用以下代码提取原始URL:

func NewHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    ou := vars["original-url"]
    //Use url.QueryUnascape for pre go1.8
    originalURL, err := url.PathUnescape(ou)

    //... other processing
}

恕我直言,不建议实施这样的URL shortener服务,主要原因是HTTP动词的使用不正确。任何GET请求都不应在服务器中留下副作用,例如没有在数据库中创建记录等。

答案 1 :(得分:1)

通过将SkipClean设置为 true ,可以更改Gorilla Mux中的这种特殊行为。

router := mux.NewRouter()
router.SkipClean(true)
router.HandleFunc("/new/", index)
router.HandleFunc("/", index)
http.ListenAndServe(":"+port, router)

可以找到相关文档here