ginとは
ginは、Go言語のフレームワークの中においてメジャーで歴史あるフレームワークで、軽量かつシンプルなインターフェイスが特徴です。
今回はそんなginを使って、簡単なRESTAPIを構築していきます。
ginを導入
go getで。
go get -u github.com/gin-gonic/gin
公式githubサンプルを動かしてみましょう。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
go run main.go
http://localhost:8080/ping へアクセスしてみてください。
message":"pong"と表示されています。
r := gin.Default()
こちらの処理でデフォルトのミドルウェアで新しいルーターを作っています。
RESTAPIの構築
それでは新しく、RESTAPIを構築していきます。
サンプルとして作るのは、タイトルとディスクリプションだけ持ったArticleをPOST,GETできる機能になります。
またディレクトリ構造は下記になります。
src
┣article
┃ ┗article.go
┃
┗httpd
┣handler
┃ ┗articleFunc.go
┗main.go
まずはArticleを定義します。
書いてある通りですね。
package article
type Item struct {
Title string `json:"title"`
Description string `json:"description"`
}
type Articles struct {
Items []Item
}
func New() *Articles {
return &Articles{}
}
func (r *Articles) Add(item Item) {
r.Items = append(r.Items, item)
}
func (r *Articles) GetAll() []Item {
return r.Items
}
続いて上記ファイルで定義したArticleのfunctionをまとめたファイルです。
こちらもそのままな処理ですね。
package handler
import (
"net/http"
"restAPI/article"
"github.com/gin-gonic/gin"
)
func ArticlesGet(articles *article.Articles) gin.HandlerFunc {
return func(c *gin.Context) {
result := articles.GetAll()
c.JSON(http.StatusOK, result)
}
}
type ArticlePostRequest struct {
Title string `json:"title"`
Description string `json:"description"`
}
func ArticlePost(post *article.Articles) gin.HandlerFunc {
return func(c *gin.Context) {
requestBody := ArticlePostRequest{}
c.Bind(&requestBody)
item := article.Item{
Title: requestBody.Title,
Description: requestBody.Description,
}
post.Add(item)
c.Status(http.StatusNoContent)
}
}
最後はメインとなるmain.goです。
package main
import (
"restAPI/httpd/handler"
"restAPI/article"
"github.com/gin-gonic/gin"
)
func main() {
article := article.New()
r := gin.Default()
r.GET("/article", handler.ArticlesGet(article))
r.POST("/article", handler.ArticlePost(article))
r.Run() // listen and serve on 0.0.0.0:8080
}
ここまで構築をしたら下記で起動してみてください
go run httpd/main.go
http://localhost:8080/article
へのPOSTとGETが利用できるようになっているはずです。
試しにPostmanを用いて行ってみます。
POST(HeadersにContent-Type:application/jsonを設定)
以上になります。
参考資料
https://github.com/gin-gonic/gin
https://gin-gonic.com/ja/docs/