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
リクエストはサーバに副作用を残すべきではありません。データベースなどにレコードが作成されていません。
クエリのparamに渡して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エンコードされているはずです。指定されたURLの例は有効なURLではないため、パーサーで正しく動作することは保証されません。 – Adrian