emahiro/b.log

Drastically Repeat Yourself !!!!

goでAPIのスケルトンを作成する

以前書いた以下のエントリーからさらい一歩進めました。

ema-hiro.hatenablog.com

ema-hiro.hatenablog.com

内容は net/httpgorilla/mux を使ってroutingを作る超薄いAPIサーバーを作成する際にこれだけコピれば簡単にapiサーバーを立てることができるみたいなものを作ることです。
rubyでいうsinatra的なものを作りたかった感じです。

net/httpを使うパターン

ディレクトリ構造

go_diet_api_skelton
  src
    go_diet_api_skelton
      handler/
        root.go
      web/
        router.go
      main.go

実際のコードは以下

github.com

/ にアクセスしてみる

$ curl -i http://localhost:808012/23 09:51:22 2017
HTTP/1.1 200 OK
Date: Sat, 23 Dec 2017 00:51:33 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8

Hello World

goの標準機能だけで作成するどシンプルなAPIサーバーだと思います。
goの net/http が非常にシンプルで強力なので、正直これくらいシンプルな方がいいのではと思います。

gorilla/muxを使う

ディレクトリ構造

ディレクトリ構造は同じ

go_diet_api_skelton
  src
    go_diet_api_skelton
      handler/
        root.go
      web/
        router.go
      main.go

gorilla/mux を入れる。

$ dep ensure -add github/gorilla/mux

実際に書いたコードは以下

github.com

/ にアクセスしてみる

$ curl -i http://localhost:808012/23 09:51:22 2017
HTTP/1.1 200 OK
Date: Sat, 23 Dec 2017 00:51:33 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8

Hello World

gorillaの方が以下のような感じで、routingでmethod等を指定できるので便利です。

m.HandleFunc("/", handler.Root).Methods("GET")

まとめ

以前のエントリーでは、routingまで main.go に記載していました。
しかし、main.goは薄く保ちつつ、routingの責務は router.go に負わせた方が適切だと考え、いっそのこと、汎用的に使える雛形が欲しいと思ったので、2パターンで書いてみました。