Edited at

🙂< 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"
}
]

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