Go_Echo_REST01

go で REST サーバーを構築するにあたり、Echo で GET と POST の動きを確認してみた。

ルーティング

想定する API のルーティング。

  1. GET /

    基本形

  2. GET /hello?message=MESSAGE

GET リクエストのクエリーストリングを受け付け、テキストを返す

  1. GET /api/hello?message=MESSAGE

GET リクエストのクエリーストリングを受け付け、JSONを返す

  1. POST /api/hello?message=MESSAGE

POST リクエストで JSON を受け付け、JSON を返す

  1. PUT /api/hello?message=MESSAGE

POST リクエストで JSON を受け付け、JSON を返す

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main

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

func main() {
e := echo.New()
e.GET("/", HandleIndexGet)
e.GET("/hello", HandleMessageGet)
e.GET("/api/hello", HandleAPIMessageGet)
e.POST("/api/hello", HandleAPIMessagePOST)
e.PUT("/api/hello", HandleAPIMessagePUT)
e.Logger.Fatal(e.Start(":8080"))
}

func HandleIndexGet(c echo.Context) error {
return c.String(http.StatusOK, "Hello, Echo World!!")
}

func HandleMessageGet(c echo.Context) error {
message := c.QueryParam("message")
return c.String(http.StatusOK, "Hello, " + message)
}

func HandleAPIMessageGet(c echo.Context) error {
message := c.QueryParam("message")
return c.JSON(http.StatusOK, map[string]interface{}{"hello": message})
}

type ResultData struct {
Message string `json:"message"`
}

func HandleAPIMessagePOST(c echo.Context) error {
result := new(ResultData)
if err := c.Bind(result); err != nil {
return err
}
return c.JSON(http.StatusOK, map[string]interface{}{"message": result.Message})
}

func HandleAPIMessagePUT(c echo.Context) error {
result := new(ResultData)
if err := c.Bind(result); err != nil {
return err
}
return c.JSON(http.StatusOK, map[string]interface{}{"message": result.Message})
}

クエリーストリングを受け取る

c.QueryParam(“パラメーター名”)でクエリーストリングを受け取る

クエリーストリングやPOSTデータで受け取ったパラメーターをJSONに埋め込む

  1. JSON の内容を構造体で表す
1
2
3
type ResultData struct {
Message string `json:"message"`
}
  1. リクエスト内のパラメーターを構造体に bind する
1
2
3
4
result := new(ResultData)
if err := c.Bind(result); err != nil {
return err
}
  1. レスポンス用の JSON を構築する
1
return c.JSON(http.StatusOK, map[string]interface{}{"message": result.Message})

動作確認

GET /hello

1
2
$ curl http://localhost:8099/
Hello, Echo World!!

GET /hello?message=MESSAGE

1
2
$ curl "httapi/hello?message=Message"
{"hello":"Message"}

GET /api/hello?message=MESSAGE

1
2
$ curl "http://localhost:8099/api/hello?message=Message"
{"hello":"Message"}

POST /api/hello?message=MESSAGE

1
2
$ curl -X POST -H "Content-Type: application/json" -d '{"message":"HELLOWORLD"}' http://localhost::8099/api/hello
{"message":"HELLOWORLD"}

PUT /api/hello?message=MESSAGE

1
2
3
$ curl -X PUT -H "Content-Type: application/json" -d '{"message":"HELLOWORLD"}' http://localhost
:8099/api/hello
{"message":"HELLOWORLD"}