我正在尝试在Golang中传递一个URL作为参数,但我还没有找到我所看过的所有教程中的解决方案。问题是我只能获得返回的网址减去一个关键的正斜杠。
我的处理程序如下所示:
router.HandleFunc("/new/{url}", createURL)
所以请求看起来像是:
www.myapp.heroku.com/new/https://www.google.com
但是,我得到的网址缺少斜杠:
http:/www.google.com
我确定它可能与RFC3986有关,但是有没有办法传入url呢?
答案 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。