🐡

Echo(Go)を使う

2024/09/21に公開

使っていく。

$ go version
go version go1.22.5 darwin/amd64

Echoの最新バージョンは4.12.0
https://echo.labstack.com/docs/quick-start

go get github.com/labstack/echo/v4

ファイルを作成する

server.go
package main

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

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

サーバーを動かして稼働確認する。

console
$ go run server.go
   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.12.0
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323

$ curl http://localhost:1323
Hello, World!                           

チュートリアルに沿ってRESTAPIを作成する。
https://echo.labstack.com/docs/quick-start
まずは GET の1件取得版を試す。

実装例では、1ファイル中(server.go)にルーティングも、APIの実装も含める形になっている。あまりひとつの関数が大きくならないように分けて実装する。同一パッケージにserver/route/apiの3ファイルを作成する。

ファイル構成は以下のように同一階層にmainパッケージで3ファイル作成する

server.go
route.go
api.go

まずはrouteから。Goの文法として別ファイルから関数に参照する場合は同一パッケージであっても関数名の頭文字を大文字するにする必要がある。

route.go
package main
import (
	"github.com/labstack/echo/v4"
)
func Route(e *echo.Echo) {
	e.GET("/user/:id", GetUser)
}

次はAPIを実装する

api.go
package main
import (
	"net/http"
	"github.com/labstack/echo/v4"
)
// 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)
}

最後にserver.go

server.go
package main
import (
	"github.com/labstack/echo/v4"
)
func main() {
	e := echo.New()
	Route(e)
	e.Logger.Fatal(e.Start(":1323"))
}

再起動する。同一パッケージ内で関数を参照する場合起動時にクラスを明確に指定しないとエラーになるので*.goという指定をする。実装できた。

$ go run *.go
$ curl http://localhost:1323/user/112
112

想定通り動いたので、echoのテストも試してみる。Goは ファイル名_test.go とすることで自動的にテストコードと認識してくれる。仮想的にAPIの実装部分に沿ってテストを整備する。実際にはwebサーバを起動した上で関連モジュール含めて評価するテストコードにするべきだが、一旦はechoのチュートリアルを消化する。

api_test.go
package main
import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/labstack/echo/v4"
	"github.com/stretchr/testify/assert"
)
func TestGetUser(t *testing.T) {
	e := echo.New()
	req := httptest.NewRequest(http.MethodGet, "/", nil)
	rec := httptest.NewRecorder()
	c := e.NewContext(req, rec)
	c.SetPath("/user/:id")
	c.SetParamNames("id")
	c.SetParamValues("12345")
	if assert.NoError(t, GetUser(c)) {
		assert.Equal(t, http.StatusOK, rec.Code)
		assert.Equal(t, "12345", rec.Body.String())
	}
}

echoのAPIチュートリアルを試してみました。次回は機能としてOAuthの認証や登録/更新/削除のAPIを実装してみます。

Discussion