軽量HTTProuter(httprouter)

f:id:daihase:20190809022658p:plain

こんにちは、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は標準でも豊富なパッケージが揃っていますが、こうしたサードパーティーのツールやフレームワークなど活用すればより開発が楽になります。

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