JSONレスポンスを返してみよう
先ほど作ったmain.goに、レスポンスとして JSON を返すエンドポイントを追加しましょう。
TIP
JSON について分からない人は JSONってなにもの? | Think IT(シンクイット)
JSON をレスポンスとして返すためには、c.JSONメソッドに構造体を渡します。
先ほどの章で作成したmain.goに、以下のようなエンドポイントを追加して、JSONレスポンスを返してみましょう。
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
// JSONで返すための構造体を定義
type jsonData struct {
Number int
String string
Bool bool
}
func main() {
// Echoの新しいインスタンスを作成
e := echo.New()
// 「/json」というパスのエンドポイントを定義
e.GET("/json", jsonHandler)
// Webサーバーをポート番号8080で起動し、エラーが発生した場合はログにエラーメッセージを出力する
e.Logger.Fatal(e.Start(":8080"))
}
func jsonHandler(c echo.Context) error {
// レスポンスとして返す値を構造体として定義
response := jsonData{
Number: 10,
String: "hoge",
Bool: false,
}
// HTTPステータスコードは200番で、構造体をJSONに変換してクライアントに返す
return c.JSON(http.StatusOK, &response)
}書き換えたら、localhost:8080/json にアクセスして確認してみましょう。

タグを追加することで構造体のフィールドに対応する、JSON のキー名を指定できます。
Go の構造体のフィールドはパスカルケースですが、JSON のフィールドは普通キャメルケース / スネークケースであるため、main.goの構造体を以下のように書き換えましょう。
type jsonData struct {
// Numner -> number (omitemptyは、ゼロ値の場合はそのフィールドを出力しないという意味)
Number int `json:"number,omitempty"`
String string `json:"string,omitempty"`
Bool bool `json:"bool,omitempty"`
}Postmanでリクエストしてみよう
Postman を起動したら、workspace を作成して移動し、Ctrl + N->HTTPまたはOverviewタブの横にある+を押して、リクエスト設定画面を開きます。

Enter URL or paste textとあるところで HTTP method と URL を指定できます。
Postman を使って、GET リクエストを自分のサーバーに送ってみましょう。 つまり、HTTP MethodとしてGETを使用して、URLhttp://localhost:8080/helloにリクエストを送信しましょう。
HTTP Method: GET
URL: http://localhost:8080/hello以下の画像のように設定してください。

Hello, World.と表示されれば成功です。
次に POST リクエストを使ってみましょう
POST ではサーバーにデータを送ることができます。
- Postman で Body タブを選択
- ラジオボタンの
rawを選択 - 右に出てくるプルダウンから
JSON(application/json)を選択します
POST で渡せるデータの型は複数あり、上記の操作で JSON を使うということを明示しています。
以下のように自分の traQ ID を POST してみましょう。
HTTP method: POST
URL: https://eo6mn2b7rlihmgg.m.pipedream.net{
"traq_id": "pikachu"
}

traq_idがpikachuの例だと、上の画像のように、以下のような JSON が返ってきます。
{
...
"body": {
"traq_id": "pikachu"
}
}自分のサーバーでPOSTを受け取ってみよう
POST で JSON を受け取って、内容をそのまま返すサーバーを作ってみます。e.GETと同じように、e.POSTと書くことで POST を受け取ることができます。
POST のハンドラは、受け取りたい JSON を示す空の変数を先に用意し、ContextのBindに渡すことで送られてきたデータを取り出すことができます。
データが存在しなかったりした場合には、返り値のerrにエラーが入ります。
逆にエラーがないときはerrにnilが返ってくるので、ifで条件分岐をします。
package main
import (
"fmt"
"net/http"
"github.com/labstack/echo/v4"
)
// Jsonで受け取り、構造体に変換して返すための構造体を定義
type jsonData struct {
Number int `json:"number,omitempty"`
String string `json:"string,omitempty"`
Bool bool `json:"bool,omitempty"`
}
func main() {
e := echo.New()
// `e.GET`と同じように、`e.POST`と書くことで POST を受け取ることができます。
e.POST("/post", postHandler)
e.Logger.Fatal(e.Start(":8080"))
}
func postHandler(c echo.Context) error {
// 受け取りたい JSON を示す空の変数を先に用意する。
data := &jsonData{}
// 受け取った JSON を data に代入する
err := c.Bind(data)
if err != nil { // エラーが発生した時、以下を実行
// 正常でないためステータスコード 400 Bad Requestを返し、 エラーを文字列に変換して出力
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("%+v", err))
}
// エラーが起きなかったとき、正常なのでステータスコード 200 OK を返し、リクエストデータをそのまま返す
return c.JSON(http.StatusOK, data)
}Postman を使って実際に受け取れている / 送り返せているか確認してみましょう。
INFO
omitempty を指定していると false, 0, 空文字("")は返ってきません。(omitempty は、ゼロ値の場合はそのフィールドを出力しないという意味でしたね。)
