Go
AWS
golang
GoogleAppEngine
GoogleCloudPlatform

🙂< 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