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
お問い合わせ・ご依頼はこちらから