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

How do I pass a URL as a parameter in a Golang route?

我试图在 Golang 中传递一个 URL 作为参数,但我无法在我看过的所有教程中找到解决方案。问题是我只能得到 url 到 return 减去关键的正斜杠。

我的处理程序如下所示:

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

所以请求看起来像:

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

但是,我得到的 url 缺少一个斜杠:

http:/www.google.com

我确定它可能与 RFC3986 有关,但是有没有办法按原样传递 url?

看完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 请求都不应在服务器中留下副作用,例如没有在数据库中创建记录等

可以通过将 SkipClean 设置为 true.

来更改 Gorilla Mux 中的这种特殊行为
router := mux.NewRouter()
router.SkipClean(true)
router.HandleFunc("/new/", index)
router.HandleFunc("/", index)
http.ListenAndServe(":"+port, router)

可以找到相关文档here