こんにちは!学生アルバイトの栃沢颯太です。

今回はパラメーターに名前を指定したらその人のプロフィール情報を返すような簡易な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をつくることは可能です。興味ある方はやってみると面白いかもしれません。