MAGAZINE
ルーターマガジン
Go言語(golang)のWebサーバーEchoで、簡単なAPIをつくってみた
こんにちは!学生アルバイトの栃沢颯太です。
今回はパラメーターに名前を指定したらその人のプロフィール情報を返すような簡易なAPIをgolangを用いてつくる方法を紹介します。rubyのフレームワークといったらrailsかsinartaとなりますが、golangではrailsのような主流なフレームワークは決まっていないため、今回はEchoというフレームワークを使ってみました。データのやり取りを確認するためにデータベースにはあらかじめ下の写真のような構造のhigh_schoolテーブルをつくり、適当に値を入れておいてください。
インストール
echoのインストールをする
go get -u github.com/labstack/echo/...
mainパッケージの作成
それではさっそく実装していきます。main.goというファイルをつくってそこに書いていきます。まずはインポートをします。 "./handler"は後で解説します。
package main import ( "github.com/labstack/echo" "github.com/labstack/echo/middleware" // handlerパッケージのインポート "./handler" )
次にmain関数を実装する
func main() { // インスタンスの作成 echo := echo.New() // ログなど echo.Use(middleware.Logger()) echo.Use(middleware.Recover()) // ルーティング echo.GET("/high_school/:name", handler.SelectMember()) echo.GET("/high_school/all", handler.SelectMembers()) // サーバー起動、ポート番号の指定 echo.Start(":1323") }
middleware.LoggerはHTTPのリクエストをログとってくれて、コンソールに出力してくれる。
middleware.Recoverはアプリケーションのどこかで予期せずにpanicを起こしてしまっても、サーバは落とさずにエラーレスポンスを返せるようにリカバリーするミドルウェア
localhost:1323/high_school/:nameにリクエストが来たら、handlerパッケージのSelectMemberメソッド実行し、
localhost:1323/high_school/allにリクエストが来たら、handlerパッケージのSelectMembersメソッドを実行する。
echo.Start(:1323)でポート番号1323でサーバーを起動させる。
handlerパッケージの作成
main.goのあるディレクトリで以下のコマンドを実行$ mkdir handler // handlerディレクトリの作成 $ touch handler/handler.go // handlerディレクトリにhandler.goというファイルの作成
mysqlを使うのでそこら辺のインポートをしておきます。gorpはgolangのORMです。golangのORMと言ったらこれ!というものがないので、とりあえずgorpにしてみました。特にこれといった理由はないです(笑)
package handler import ( "net/http" "github.com/labstack/echo" "github.com/coopernurse/gorp" "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" )
次に、リクエストしたら実行されるメソッドをつくる
var ( // mysqlに接続 high_schoolデータベースに接続している db, err = sql.Open("mysql", "username:password@tcp(localhost:3306)/high_school") dbmap = &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}} ) type Member struct{ Id int32 `db:"id"` Name string `db:"name"` Birthday string `db:"birthday"` Blood string `db:"blood_type"` Constellation string `db:"constellation"` Height string `db:"height"` } // 生徒一人のプロフィールを返すメソッド func SelectMember() echo.HandlerFunc { return func(c echo.Context) error { // nameパラメーターを受け取る name := c.Param("name") var members = []Member{} // select * from members where name = name;を実行し、membersに格納する dbmap.Select(&members, "SELECT * FROM members WHERE name =" + "'" + name + "'" + ";") return c.JSON(http.StatusOK, members) } } // 全生徒のプロフィールを返すメソッド func SelectMembers() echo.HandlerFunc { return func(c echo.Context) error { var members = []Member{} dbmap.Select(&members, "SELECT * FROM members;") return c.JSON(http.StatusOK, members) } }
完成・確認
main.goを実行する
実行してサーバーが起動すると、以下のような表示がされる。
$ go run main.go ____ __ / __/___/ / ___ / _// __/ _ \/ _ \ /___/\__/_//_/\___/ v4.1.13 High performance, minimalist Go web framework https://echo.labstack.com ____________________________________O/_______ O\ ⇨ http server started on [::]:1323
そこで、山田太郎のプロフィールを取得するために、
localhost:1323/high_school/山田太郎というリクエストしてみると
ちゃんと返ってきていますね!
最後に
今回紹介したのはselectすることだけでしたが、上のコードを少しいじれば、createやdeleteなどもできます。また、今日はgolangのフレームワークをつかってAPIを実装しましたが、フレームワークなしでもgolangはAPIをつくることは可能です。興味ある方はやってみると面白いかもしれません。
CONTACT
お問い合わせ・ご依頼はこちらから