GoのOpenAPIClientを使う
GoでOpenAPIを使う場合サーバーサイド(呼び出される側)が多いと思うんですが、クライアントサイドでOpenAPIを使いたい場面があったため、備忘録を兼ねてメモをしておきます。
リポジトリは以下になります。
sample-go-lang-openapi
検証環境
goは1.21.5
go version
# >>> go version go1.21.5 windows/amd64
openapi-generatorは7.5.0
OpenAPIのtemplateと用いてコードを生成
まずはgoのclientサイドのコードを生成します。
docker run --rm \
\ # 生成したコードをホスト側にコピーするための設定\
-v "${PWD}/go-api-client:/local" \
\ # openapiの定義ファイルをコンテナ内にマウントするための設定\
-v "${PWD}/openapi/:/usr/openapi" \
\ # openapi-generator-cliのコンテナイメージを指定する\
openapitools/openapi-generator-cli generate \
\ # openapi-generator-cliの引数を指定する\
-i /usr/openapi/main/openapi.yml \
\ # 生成するコードの言語を指定する\
-g go -o /local \
\ # 生成するコードのテンプレートを指定する\
-t /usr/openapi/template/go
go-api-client/docs/
以下にサンプルコードを含めたドキュメントが生成されています。
自作モジュールから生成されたモジュールを読めるように調整
今回はgo1.18から使えるgo.work
でモジュール間の管理を行います。
go 1.20
use ./go-api-client
use ./my-lib
これで./my-lib/main.go
から./go-api-client
が読み込めるようになります。
package main
import (
"context"
"fmt"
"os"
openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID"
)
func main() {
pet := *openapiclient.NewPet(int64(123), "Name_example") // Pet |
configuration := openapiclient.NewConfiguration()
apiClient := openapiclient.NewAPIClient(configuration)
r, err := apiClient.PetsApi.CreatePets(context.Background()).Pet(pet).Execute()
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling `PetsApi.CreatePets``: %v\n", err)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
}
}
import errorの解消
model_pet.go
を見てみると、fmt
やbytes
のimport errorが出ています
生成物に対するフォーマットやimportの調整はどの言語でも起こる問題で、File post-processingという機能が公式に用意されています。
これを読むとGO_POST_PROCESS_FILE
と--enable-post-process-file
を用いて解消できるようですが、今回はdockerを生成用のCLIとして用いていることもあり、素朴にgoimports -w ./
をシェルスクリプトに加えてごまかしています。
OpenAPI codegenを実行後に以下を加えています。
goimports -w ./
goimports
がない方は以下でinstallできます。
go install golang.org/x/tools/cmd/goimports@latest
これでコンパイルも無事通るようになりました。
コメント