Go
AWS
golang
GoogleAppEngine
GoogleCloudPlatform

🙂< golang+gae+datastore+echo+jsonのapiです

はじめに

golang+gae+datastore+echo+jsonのapiサンプルです。

コード

前半はサーバ起動やルーティング、後半はハンドラ関数になっています。全てのコードmain.goです。

前半

main.go
package main

import (
    "fmt"
    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"
    "net/http"
    "time"

    "google.golang.org/appengine"
    "google.golang.org/appengine/datastore"
    "google.golang.org/appengine/log"
)

type User struct {
    Name    string    `json:"name"`
    Age     int       `json:"age"`
    Country string    `json:"country"`
    Date    time.Time `json:"date"`
}

type Response struct {
    Notice string
    Error  string
}

var e = createMux()

func createMux() *echo.Echo {
    e := echo.New()
    http.Handle("/", e)
    return e
}

func init() {
    e.Use(middleware.CORS())
    e.GET("/", getHandler)
    e.POST("/put", putHandler)

}

後半

main.go
func putHandler(c echo.Context) error {
    ctx := appengine.NewContext(c.Request())
    user := new(User)
    if err := c.Bind(user); err != nil {
        return err
    }
    user.Date = time.Now()
    key := datastore.NewIncompleteKey(ctx, "User", nil)
    _, err := datastore.Put(ctx, key, user)

    if err != nil {
        log.Errorf(ctx, "%v", err)
    } else {
        fmt.Fprintf(c.Response().Writer, "格納成功。RequestされたJsonは以下になります。\n")
    }
    return c.JSON(http.StatusOK, user)
}

func getHandler(c echo.Context) error {
    ctx := appengine.NewContext(c.Request())

    user := &User{
        Age: 10,
    }

    // クエリ生成・実行
    q := datastore.NewQuery("User").Filter("Age =", user.Age)
    it := q.Run(ctx)

    var users []User
    for {
        var user User
        _, err := it.Next(&user)       // 次のデータを取得
        if err != nil {
            if err == datastore.Done {   // データが無くなったらループを抜ける
                break
            }
            return err                   // エラー発生!
        }
        users = append(users, user)    // スライスにデータを追加
    }
    return c.JSON(http.StatusOK,users)
}

リクエスト

POSTMAN等で、下記のJSONをPOSTしてみましょう。

request用
{"name":"Taro","age":18,"country":"Japan"}

そうするとDatastoreに格納されているかと思います。逆にGETでアクセスすると、

hoge
[
  {
    name: "Taro",
    age: 18,
    country: "Japan",
    date: "2018-09-14T04:32:45.512892Z"
  },
  {
    name: "Goro",
    age: 10,
    country: "Japan",
    date: "2018-09-14T04:34:03.500539Z"
  }
]

みたいな形で出力されるかと思います。