こんにちは、daihaseです。
今日は前回やった「net/httpパッケージを使ったWebサーバー」、このような処理もライブラリを使ってもっと楽に!そして高性能に!というのをお題とします。
そこで紹介するのがhttprouter。GitHubのスター数も凄いですね。これが全ての基準ではないですが、ただそれだけ利用者も多く人気ということかと。
httprouterはその名前が示すように、HTTPの要求を特定のハンドラにルーティングします。基本的なGo標準のnet/httpと比較して以下のような機能を備えています。
- ルートパス内の変数を許可する
- RESTメソッド(GET、POST、PUTなど)に対応
- 高いパフォーマンス性を提供
早速簡単なサンプルを動かして見ましょう。
まずhttprouterを使うにはパッケージを取ってくる必要があるので以下コマンドを実行します。
$ go get github.com/julienschmidt/httprouter
あとはhttproutersample.goと名付けた全コードを見てみましょう。
package main import ( "bytes" "fmt" "log" "net/http" "os/exec" "github.com/julienschmidt/httprouter" ) func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { fmt.Fprintf(w, "Hello World!") } func getCommandOutput(command string, arguments ...string) string { cmd := exec.Command(command, arguments...) var out bytes.Buffer var stderr bytes.Buffer cmd.Stdout = &out cmd.Stderr = &stderr err := cmd.Start() if err != nil { log.Fatal(fmt.Sprint(err) + ": " + stderr.String()) } err = cmd.Wait() if err != nil { log.Fatal(fmt.Sprint(err) + ": " + stderr.String()) } return out.String() } func GoVersion(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { fmt.Fprintf(w, getCommandOutput("/usr/local/bin/go", "version")) } func ShowId(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { fmt.Fprintf(w, "My number is : %s", ps.ByName("id")) } func main() { router := httprouter.New() router.GET("/", Index) router.GET("/user/:id", ShowId) router.GET("/go-version", GoVersion) log.Fatal(http.ListenAndServe(":8000", router)) }
これを実行してみます。
$ go run httproutersample.go
curlでも直接ブラウザ上からURLを叩いてもいいのですが、簡単なんでブラウザで見てみましょう。
ブラウザを起動し、http://localhost:8000/ と入力して叩いて見てください。
Hello World!
Hello World!の文字が出たかと思います。同じように http://localhost:8000/go-version と打ってみましょう。
go version go1.10.3 darwin/amd64
環境にもよりますが、自分の場合はこのようになりました。最後にパラメータをパスに含めたURLを叩いてみます。
ブラウザに http://localhost:800/user/1 と入力してみましょう。
My number is : 1
ちゃんと表示されましたね。 このようにhttprouterを使えば簡単にルーティングを実装出来ます。
どうでしょうか、これを使えば通常のnet/httpパッケージよりわかりやすくルーティングを組めるかと思います。Goは標準でも豊富なパッケージが揃っていますが、こうしたサードパーティーのツールやフレームワークなど活用すればより開発が楽になります。
それでは良い開発ライフを〜