Golang + OpenAPIを試してみる

golang Golang

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を見てみると、fmtbytesのimport errorが出ています

file

生成物に対するフォーマットや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

これでコンパイルも無事通るようになりました。

参考

コメント

タイトルとURLをコピーしました