yosemite's blog

About technology, books, diary

Go + Echo で REST API 入門

echo
High performance, extensible, minimalist Go web framework

はじめに

Go言語での開発が 1 つ目が無事に終わり、 2 回目の開発を始めた。
主に SSKDs 向けの Go パッケージ, API の提供というのが今回の成果物。

パッケージや 外部から呼び出す API ということで開発効率、運用管理を楽にするためフレームワークを使用するという選択をした。

Go言語のフレームワークについて以前書いた記事が ↓
blog.yosemite2307.com

他の言語に比べてデファクト的なフレームワークは存在しない。

ということだけども、今回は比較的ドキュメントも豊富で、 高性能で拡張可能なミニマリスト がウリな Echo を採用した。

Get Started Echo

インストール

手順については、上記リンクの Get Started の流れに沿っている。
まずは、プロジェクトを作成して、 go get する。

$ go get -u github.com/labstack/echo...

Hello World

server.go を作成して、下記を記述していく。

package main

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

const text = `Hello, World from echo!
echo is high performance, extensible, minimalist Go web framework`

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, text)
    })
    e.Logger.Fatal(e.Start(":1323"))
}

サーバを立ち上げると…

$ go run server.go

hello world

ちゃんとテキストが表示され、レスポンスも 200 で返ってきているのが分かる。(URL は間違えているだけなのでご放念を)

※ 次からは、ブラウザではなく API テストツールの Postman を使って検証していく。

GET Request

Hello world までできるとルートパスへのアクセスまで実装できているので、次に GET メソッドでのリソースの取得を実装する。
先ほどの server.go に以下を追記していく。

func main() {

    ... ( 省略 ) ...

    // Routing
    e.GET("/users/:id", getUser)

    e.Logger.Fatal(e.Start(":1323"))
}

// e.GET("/users/:id", getUser)
func getUser(c echo.Context) error {
    // User ID from path `users/:id`
    id := c.Param("id")
    return c.String(http.StatusOK, id)
}

エンドポイント /users/:id でユーザ情報を取得するルーターを作成した。

get_request

また、クエリパラメータを渡して GET したい時もあると思うので、次に試してみる。
エンドポイントは /show とし member, team という 2 つのパラメータを受け取れるようにしておく。

func main() {

    ... ( 省略 ) ...

    // Routing
    e.GET("/show", show)

    e.Logger.Fatal(e.Start(":1323"))
}

//e.GET("/show", show)
func show(c echo.Context) error {
    // Get team and member from the query string
    team := c.QueryParam("team")
    member := c.QueryParam("member")
    return c.String(http.StatusOK, "team : " + team + " , member : " + member)
}

サーバーを再起動し、 /show?team=hoge&member=fuga でアクセスしてみる。

query_parameters

画像の通り、 URL から渡された 2 つのパラメータの値を受け取り 200 が返されている。

POST Request

次は、POST メソッドでリソースの新規登録を行う場合を実装していく。

func main() {

    ... ( 省略 ) ...

    // Routing
    e.POST("/save", save)

    e.Logger.Fatal(e.Start(":1323"))
}

func save(c echo.Context) error {
    // get name and email
    name := c.FormValue("name")
    email := c.FormValue("email")

    return c.String(http.StatusOK, "<b>Thank you! "+name+"</b><br>Your email address is : "+email)
}

Body に name, email をそれぞれ入れて、POST メソッドでリクエストを送っている。

post_request

おわりに

長くなってしまったけど、 echo ではこのようにルーティングとそれに対応するハンドラを書いてあげれば簡単に API が作れることが分かった。

今回は省略するが、 server.goe.GET("/", hoge) としているところを PUT とか DELETE とかに変えれば違う HTTP メソッドも簡単に実装できそう。

最後まで見てくださりありがとうございました。

それじゃまた🙋‍♂️