軽量Webツールキット gorilla/mux

f:id:daihase:20190809022658p:plain

こんばんは、daihaseです。

今回は前回紹介したhttprouterのように軽量、それでいてAPI開発などをより楽にしてくれるWebツールキット、gorilla/muxを紹介したいと思います。

gorilla/muxには、Webアプリケーションのルーティング方法を制御するためのオプションが多数用意されており、主に以下のような機能をもっています。

 

  • URLパスに基づいてマッチング
  • クエリ文字列の取得/マッチング
  • ドメインに基づいてのマッチング
  • サブドメインに基づいてのマッチング
  • 逆URLマッピング(データからURLを生成)

 

などなど、開発する上での様々な便利機能が搭載されてるツールといった感じでしょうか。早速導入して動きを見て見ましょう。

 

gorilla/muxのインストール

以下のコマンドを叩くだけでインストールが完了します。これはhttprouterの時も同じでしたね。

$ go get -u github.com/gorilla/mux

 

 

動作確認

前回httprouterを使ったサンプルの一部を、gorilla/muxを使って実装してみます。gorillamuxsample.goというファイル名でここでは作成しています。

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"

    "github.com/gorilla/mux"
)

func showId(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    w.WriteHeader(http.StatusOK)

    fmt.Fprintf(w, "My number is : %v\n", vars["id"])
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/user/{id:[0-9]+}", showId)

    srv := &http.Server{
        Handler:      r,
        Addr:         "127.0.0.1:8000",
        WriteTimeout: 15 * time.Second,
        ReadTimeout:  15 * time.Second,
    }
    log.Fatal(srv.ListenAndServe())
}

 

httprouterの記事ではURLパラメータをハンドラ関数に渡すために、以下のように引数を追加していました。

func ShowId(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    fmt.Fprintf(w, "My number is : %s", ps.ByName("id"))
}

 

ps httprouter.Paramsの部分ですね。 ここをps.ByName("hoge")とするとこで、router.GET("/user/:id", ShowId)のように ":id" 部分に渡ってきたパラメータを取得出来ました。

gorilla/muxでは引数を追加せずに、リクエストオブジェクトのための変数(vars)を定義し、そのVarsメソッドを使ってこれを取得します。

muxはパス内の変数を解析し、その変数は全てVarsメソッドを呼び出すことが出来ます。ちなみにmuxのVarsメソッドは以下のように実装されていて、リクエストを解析し、それをmapとして返却してるのがわかりますね。

func Vars(r *http.Request) map[string]string {
    if rv := contextGet(r, varsKey); rv != nil {
        return rv.(map[string]string)
    }
    return nil
}

 

これによってvars["id"]とidキーを指定することで、そのvalue値が取得出来ています。

 

 

動作確認

では実際に動かして見ましょう。 以下のコマンドを実行し、サンプルを起動します。

$ go run gorillamuxsample.go

 

curlでも実際にブラウザを叩いても実行結果が確認出来るかと思います。 ここではgorillamuxsample.goを動かしてるターミナルとは別のwindowを立ち上げ、そちらでcurlを実行してみましょう。

$ curl http://localhost:8000/user/1
My number is : 1

 

ちゃんとURLリクエストパラメータをhttprouterの時のように簡単に取得し表示出来たかと思います。

今回は定番のルーティングで例を示しましたが、他にもSubrouterPath Prefixなど便利な機能がたくさんあります。このgorilla/muxを使えば一般的なRESTFul API開発もしっかり設計ができ、かつシンプルに開発が出来るでしょう。

またgorillaはmux以外にもsessionやwebsocketなど、Web開発に必要なツールが他にも多くあるので公式で色々触ってみるのもいいでしょう。

それでは良い開発ライフを〜