goのginを使ってjsonでパラメータを返すサーバーを立ててみた
やんてらです。今回はgoの話になります。 goのフレームワークは何が良いのか分からなかったのでネットで調べたところginが良さげだったので採用してみました。
本題
レストランの一覧を返すjson用のapiサーバを立てていきます。前回と変わらずdokcerで作っていきます(構成は少し変えてます
構成
今回はこんな感じです
|-docker | |-go | |-Dockerfile |-src | |-api | |-main.go | |-restaurant.json | |-Gopkg.toml |-docker-compose.yml
Dockerfile
- 今回はalpine使ってみました
FROM golang:1.10.3-alpine3.8 COPY src/api /go/src/api/ WORKDIR /go/src/api/ RUN apk update \ && apk add --no-cache git \ && go get -u github.com/codegangsta/gin \ && go get -u github.com/golang/dep/cmd/dep \ && dep ensure EXPOSE 8080 CMD ["gin", "-i", "run"]
docker-compose.yml
version: '3' services: api: build: context: . dockerfile: docker/go/Dockerfile volumes: - ./src/api:/go/src/api - vendor:/go/src/api/vendor ports: - 8080:8080 tty: true
Gopkg.toml
[[constraint]] name = "github.com/gin-gonic/gin" version = "1.2.0" [prune] go-tests = true unused-packages = true
main.go
package main import ( "github.com/gin-gonic/gin" "io/ioutil" "encoding/json" "log" ) type Restaurant struct { Id int `json:"id"` Name string `json:"name"` } func main() { r := gin.Default() restaurant := Restaurant{ Id: 3, Name: "サイゼリヤ", } r.GET("/restaurant", func(c *gin.Context) { c.JSON(200, restaurant) }) bytes, err := ioutil.ReadFile("restaurants.json") if err != nil { log.Fatal(err) } var restaurants []Restaurant if err := json.Unmarshal(bytes, &restaurants); err != nil { log.Fatal(err) } r.GET("/restaurants", func(c *gin.Context) { c.JSON(200, restaurants) }) r.Run(":8080") }
restaurants.json
[ {"id": 1, "name": "デニーズ"}, {"id": 2, "name": "ジョナサン"} ]
実行結果
無事表示されましたね
まとめ
とりあえず、jsonで値を返すやり方がなんとなく分かったので次はフロント側でいい感じのレストランのマップを実装して行こうと思います。