Edited at

🙂< golang+gae+echo+json+webAPIです


はじめに

https://echo.labstack.com/cookbook/google-app-engineをまとめます。mapではなく構造体を利用するサンプルになります。


tree

$ tree

├── app-standalone.go
└─── src
├── app-engine.go
├── app.go
├── users.go
└── app.yaml


困りごと

どのファイルが$go build .や$ go runのエントリーポイントで、どのファイルがGoogleAppEngineに関わるルーティングなのか整理しきれていない状態です。コードに関しては、ローカル開発環境、$ dev_appserver.py gae_echo/app-engine.yaml、$ gcloud app deploy,3つの方法全て動きます。


コード


app-standalone.go

package main

func main() {
src.Start()
}



src/app.go

package src

var e = createMux()

func Start() {
e.Logger.Fatal(e.Start(":8080"))
}



src/app-engine.go

func createMux() *echo.Echo {

e := echo.New()
// note: we don't need to provide the middleware or static handlers, that's taken care of by the platform
// app engine has it's own "main" wrapper - we just need to hook echo into the default handler
http.Handle("/",e)
return e
}


src/users.go

package src

import (
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
"log"
"net/http"
"strconv"
)

type User struct {
ID string `json:"id"`
Name string `json:"name"`
}

var user1 = User{ID: "tr", Name: "Taro"}
var user2 = User{ID: "jr", Name: "Jiro"}
var user3 = User{ID: "sr", Name: "Saburo"}

var users = []User{user1, user2, user3}

func init() {
g := e.Group("/users")
g.Use(middleware.CORS())
g.POST("",creteUser)
g.GET("",getUsers)
g.GET("/:index",getUser)
}

func getUsers(c echo.Context) error {
return c.JSON(http.StatusOK,users)
}

func getUser(c echo.Context) error {
indexStr := c.Param("index")
index,err := strconv.Atoi(indexStr)
if err != nil {
log.Fatalln(err.Error())
}

responseUser := users[index]
return c.JSON(http.StatusOK,responseUser)
}

func creteUser(c echo.Context) error {
user := new(User)
if err := c.Bind(user); err != nil {
return err
}
users = append(users,*user)
return c.JSON(http.StatusOK,users)
}



src/app.yaml

runtime: go

api_version: go1.8

handlers:
- url: /.*
script: _go_app