下級エンジニアの綴

新しく発見したことを綴っていこうと思っています。夢はでっかく上級エンジニアになることです。

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

  • 今回は自分でjsonを用意してjsonで表示する方法と外部からjsonを取得してjsonで返すという2種類のやり方で実装してみました。
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": "ジョナサン"}
]

実行結果

無事表示されましたね f:id:yanterakun:20180815201808p:plain f:id:yanterakun:20180815201803p:plain

まとめ

とりあえず、jsonで値を返すやり方がなんとなく分かったので次はフロント側でいい感じのレストランのマップを実装して行こうと思います。

参考URL

qiita.com

qiita.com