Our Story Log Blog

Go言語:ルーティング(gorilla)の優先順位について

Go言語のルーティング(gorilla)処理では、記載順序が重要です。
/hoge/{id※任意のID},/hoge/list の二つのAPIを開発したい場合を例に説明します。

/hoge/{id※任意のID},/hoge/list の順に実装した場合

下記のように実装して、/hoge/listでリクエストを投げると、「{id}」が任意の文字という意味になるため、/hoge/{id}が呼ばれます。

r.HandleFunc("/hoge/{id}", func(w http.ResponseWriter, r *http.Request) {}).Methods("GET")
r.HandleFunc("/hoge/list", func(w http.ResponseWriter, r *http.Request) {}).Methods("GET")

/hoge/list,/hoge/{id※任意のID} の順に実装した場合

/hoge/list/hoge/{id※任意のID}を別のAPIとしたい場合は、下記のように実装しましょう。 これで/hoge/listが先に呼ばれるようになります。

r.HandleFunc("/hoge/list", func(w http.ResponseWriter, r *http.Request) {}).Methods("GET")
r.HandleFunc("/hoge/{1}", func(w http.ResponseWriter, r *http.Request) {}).Methods("GET")

まとめ

ルーティングはプログラムの上から順番に決定していきます。
他のプログラミング言語でも同じようなことがあったので、ルーティング処理を書く際は注意が必要です。

Amazon:初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド

Tags: