Go言語学習もついに18日目!
ちょっと昨日は、子供の歯医者と買い物、公園と、、、 で勉強時間がって言い訳を。。。今は、子どもがアニメを見ているうちに。。。
今までのはコチラ
今日は昨日までに作ったAPIサーバーを、さらに使いやすく・拡張しやすくするために、
ルーティング処理の強化に取り組みました。
目標
- URLパスに含まれるパラメータを使って動的に処理する
- クエリパラメータを複雑にしてみる
- 外部ライブラリ gorilla/mux を使って本格的なルーティングも体験!
1. 標準ライブラリで「パターンマッチ風」の処理に挑戦
標準の net/http
ではシンプルなルーティングしかできませんが、
工夫すればURLパスの一部を取り出すことも可能です。
例「/user/たろう」のようなURLを処理する
func userHandler(w http.ResponseWriter, r *http.Request) { path := r.URL.Path parts := strings.Split(path, "/") if len(parts) >= 3 && parts[1] == "user" { name := parts[2] fmt.Fprintf(w, "こんにちは、%sさん!", name) } else { http.NotFound(w, r) } } func main() { http.HandleFunc("/user/", userHandler) http.ListenAndServe(":8080", nil) }
アクセス例
http://localhost:8080/user/たろう
→ こんにちは、たろうさん!
ポイント
strings.Split
でURLを分割してパラメータ風に取得- 標準ライブラリだけでも、工夫すれば動的URLが扱える!
2. クエリパラメータを複数取得して処理
例:「/search?keyword=Go&limit=5」のようなリクエスト対応
func searchHandler(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() keyword := query.Get("keyword") limit := query.Get("limit") if keyword == "" { keyword = "指定なし" } if limit == "" { limit = "10" } fmt.Fprintf(w, "検索キーワード: %s|件数: %s件", keyword, limit) } func main() { http.HandleFunc("/search", searchHandler) http.ListenAndServe(":8080", nil) }
3. 本格ルーティング!gorilla/muxに軽く触れてみた
標準ライブラリだけだと限界もあるので、
Goでよく使われるルーターライブラリ gorilla/mux を導入!
インストール
go mod init {ルートディレクトリ名} go get github.com/gorilla/mux
いつか、ちゃんとinitなどについて、深堀しないと。。
サンプル(動的パス+クエリ対応)
package main import ( "fmt" "net/http" "github.com/gorilla/mux" ) func userHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] fmt.Fprintf(w, "gorilla/mux版:こんにちは、%sさん!", name) } func main() { r := mux.NewRouter() r.HandleFunc("/user/{name}", userHandler) fmt.Println("サーバー起動:http://localhost:8080/user/たろう") http.ListenAndServe(":8080", r) }
アクセス例
http://localhost:8080/user/たろう
→ gorilla/mux版:こんにちは、たろうさん!
gorilla/muxのメリット
- 動的パス(/user/{name})が直感的に書ける
- クエリパラメータ、HTTPメソッド制限、ミドルウェア対応なども簡単
--- #### 今日のまとめ ###### Go言語18日目の学習ポイント - URLパスのパターンマッチ風処理は標準ライブラリでも可能 - クエリパラメータを複数取得して柔軟なリクエスト対応 - gorilla/muxを使えば、本格的なルーティングが簡単に実現できる - Goは「必要なところだけ外部ライブラリを使う」文化が合ってるかも あれですね、FastAPIとかパスパラメータを書くのも楽でしたね。 まずは、できるとわかったのがいいですね。 少しずつ、APIをGoで書けるかも。。。って思いはじめてきました。。。