Go言語学習18日目:APIルーティングを強化!パターンマッチ&gorilla/muxで実践的なルート設計に挑戦

Go言語学習もついに18日目

ちょっと昨日は、子供の歯医者と買い物、公園と、、、 で勉強時間がって言い訳を。。。今は、子どもがアニメを見ているうちに。。。

今までのはコチラ

kunio-ud-all.com

今日は昨日までに作った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で書けるかも。。。って思いはじめてきました。。。