看完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
請求都不應在服務器中留下副作用。在數據庫中沒有創建記錄等。
將它傳遞給查詢參數並對其進行urlencode。因爲取決於你用什麼多路解析器來解析,可能會有不同的解釋。例如:'?url = https%3A%2F%2Fwww.google.com%2F' –
@BogdanIulianBursuc唯一的問題是用戶只會在/ new參數後傳遞url。所以,他們首先要訪問www.myapp.heroku.com,然後得到一條指令,在/ new之後傳遞url:'www.myapp.heroku.com/new/https://www.google .com'。不幸的是,我不知道如何將它傳遞給查詢參數。 –
它應該仍然是URL編碼的。給出的示例網址不是有效的網址,因此您無法保證它們可以正常使用任何解析器。 – Adrian