gin 入門(1)
あらすじ
Go 言語の WEB フレームワークである gin を使って WEB API の作り方を調べたのでまとめようと思います。
お断り
たぶん全5回ぐらいの内容になると思うのですが、ちょっとまだ記事まとめ中なので、この記事自体をちょいちょい修正します。
完成したら github あたりで公開します。
準備
% mkdir ~/gocode/src/github.com/okamuuu/gin-tutorial && cd $_ % mkdir server worker shared
create server/main.go:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) r.Run(":8080") // listen and serve on 0.0.0.0:8080 }
サーバー起動
% go run server/main.go
動作確認テスト。xargs echo にパイプしているのは改行コード追加したいだけなんですが curl にそういうオプションないのでしょうか(調べろ)
% curl -s localhost:8080/ping | xargs echo pong
ORM を準備
create shared/db.go:
package shared import ( "database/sql" "github.com/coopernurse/gorp" _ "github.com/go-sql-driver/mysql" "log" ) type Article struct { Id int64 `db:"id" json:"id"` Title string `db:"title" json:"title"` Desc string `db:"desc" json:"desc"` Created int64 `db:"created" json:"created"` } func checkErr(err error, msg string) { if err != nil { log.Fatalln(msg, err) } } func NewDbMap(dsn string) *gorp.DbMap { db, err := sql.Open("mysql", dsn) checkErr(err, "sql.Open failed") return &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}} } func CreateTablesIfNotExists(dbmap *gorp.DbMap) { dbmap.AddTableWithName(Article{}, "articles").SetKeys(true, "Id") err := dbmap.CreateTablesIfNotExists() checkErr(err, "Create table failed") }
create shared/db_test.go:
package shared import ( "github.com/coopernurse/gorp" "testing" ) var dsn = "root:@tcp(127.0.0.1:3306)/test_db" func TestSomething(t *testing.T) { dbmap := NewDbMap(dsn) CreateTablesIfNotExists(dbmap) defer dropAndClose(dbmap) rows, _ := dbmap.Select(Article{}, "SELECT * FROM articles") if len(rows) != 0 { t.Errorf("Expected 0 invoice rows, got %d", len(rows)) } } func dropAndClose(dbmap *gorp.DbMap) { dbmap.DropTablesIfExists() dbmap.Db.Close() }
テストを実行します。あらかじめ mysql start と test_db を作成する必要があります。
% go test shared/*.go ok command-line-arguments 0.042s
次回は server/*.go をテストする方法を考えます。