GoのOpenAPI3.0コードジェネレータであるoapi-codegenは、yaml定義からGoのコードを生成できる。
今回は、サーバサイドのコードをchiで生成し、サーバとして動かすところまでを実施する。
環境
- Ubuntu 20.04 LTS (WSL2)
- Go 1.19.3
Goはインストール済みであるとする。
0. goプロジェクトの作成
mkdir go-oapi
cd go-oapi
go mod init gen
1. コードの生成
生成元となるyamlのサンプルを準備する。以下のファイルをpetstore-expanded.yaml
として作業フォルダに保存する。
また、以下をconfig.yaml
として作業フォルダに保存。
package: gen
generate:
chi-server: true
models: true
embedded-spec: true
compatibility:
apply-chi-middleware-first-to-last: true
output: petstore.gen.go
以下のコマンドを実行すると、petstore.gen.go
としてサーバサイドのコードが生成される。
go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@latest
oapi-codegen -config config.yaml petstore-expanded.yaml
2. APIの実装
サンプルコードを利用する。以下のコードをapi.goとして作業フォルダに保存し、パッケージ名をgenに変更する。
3. サーバーの作成
以下を実行し、
mkdir main
touch main/main.go
以下のコードをmain.goに記入する(サンプルコードを利用)
package main
import (
"flag"
"fmt"
"gen"
"log"
"net/http"
"os"
middleware "github.com/deepmap/oapi-codegen/pkg/chi-middleware"
"github.com/go-chi/chi/v5"
)
func main() {
var port = flag.Int("port", 8080, "Port for test HTTP server")
flag.Parse()
// swagger定義の読み込み
swagger, err := gen.GetSwagger()
if err != nil {
fmt.Fprintf(os.Stderr, "Error loading swagger spec\n: %s", err)
os.Exit(1)
}
swagger.Servers = nil
// 自分のAPI実装を入れる
petStore := gen.NewPetStore()
// chiのルータを作る
r := chi.NewRouter()
// バリデーションミドルウェアの追加
r.Use(middleware.OapiRequestValidator(swagger))
// API定義と実装を紐づけ、それをルータrに登録する
gen.HandlerFromMux(petStore, r)
s := &http.Server{
Handler: r,
Addr: fmt.Sprintf("0.0.0.0:%d", *port),
}
log.Fatal(s.ListenAndServe())
}
これができたら、以下を実行して、ライブラリをインストールしておく。
go mod tidy
4. 実行
以下のコマンドでサーバーを起動して、
go run main/main.go
以下のcurlコマンドによって動作テストができる。
# データの登録
curl -X 'POST' \
'http://localhost:8080/pets' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"tag": "string"
}'
# > {"id":1000,"name":"string","tag":"string"}
# データの表示
curl -X 'GET' 'http://localhost:8080/pets' -H 'accept: application/json' # > [{"id":1000,"name":"string","tag":"string"}]
以上です。
参考
Go の Open API 3.0 のジェネレータ oapi-codegen を試してみた
小ネタ/Open API 3.0 ジェネレータ oapi-codegen v1.11.0 のコード自動生成の方法
oapi-codegenでchi用APIインターフェースを自動生成