2017-04-26 195 views
0

我試圖在Golang中傳遞一個URL作爲參數,但我一直無法找到所有我看過的教程中的解決方案。問題是,我只能得到url返回減去一個關鍵的正斜槓。如何在Golang路由中將URL作爲參數傳遞?

我的處理程序是這樣的:

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

因此請求將如下所示:

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

但是,我的結果是缺少一個斜線的網址:

http:/www.google.com 

我確定它可能與RFC3986有關,但是有沒有辦法傳遞url?

+4

將它傳遞給查詢參數並對其進行urlencode。因爲取決於你用什麼多路解析器來解析,可能會有不同的解釋。例如:'?url = https%3A%2F%2Fwww.google.com%2F' –

+0

@BogdanIulianBursuc唯一的問題是用戶只會在/ new參數後傳遞url。所以,他們首先要訪問www.myapp.heroku.com,然後得到一條指令,在/ new之後傳遞url:'www.myapp.heroku.com/new/https://www.google .com'。不幸的是,我不知道如何將它傳遞給查詢參數。 –

+0

它應該仍然是URL編碼的。給出的示例網址不是有效的網址,因此您無法保證它們可以正常使用任何解析器。 – Adrian

回答

0

看完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請求都不應在服務器中留下副作用。在數據庫中沒有創建記錄等。

相關問題