如何在 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。
我试图在 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。