2017-04-26 5 views
0

私はGolangのパラメータとしてURLを渡そうとしています。私が見たすべてのチュートリアルで解決策を見つけることができませんでした。問題は、私は重要なスラッシュを除いたURLを返すことしかできないということです。GolangルートのパラメータとしてURLを渡すにはどうすればよいですか?

私のハンドラは、次のようになります。

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

ので、要求は次のようになります、しかし

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

私の結果はスラッシュが欠落しているURLを:

http:/www.google.com 

私はそれがおそらくRFC3986と何か関係があると確信していますが、URLをそのまま渡す方法はありますか?

+4

クエリのparamに渡して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エンコードされているはずです。指定されたURLの例は有効な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サーバ起動時に:

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 
} 

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は次のコードを使用して抽出することができる機能は次のようになります

IMHOのように、このようなサービスURL shortenerを実装することはお勧めできません。主にHTTP動詞の誤った使用が原因です。 GETリクエストはサーバに副作用を残すべきではありません。データベースなどにレコードが作成されていません。

関連する問題