LoginSignup
2
0

More than 1 year has passed since last update.

GoのOpenAPI3.0コードジェネレータ、oapi-codegenでchiのコードを生成しサーバーとして動かす

Last updated at Posted at 2022-11-05

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インターフェースを自動生成

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0