Closed2

【Go】oapi-codegenメモ

これ

openapi.ymlから構造体やルーティング、簡単なバリデーションを自動生成できる優れもの

https://github.com/deepmap/oapi-codegen

参考

  • 基本的に以下の記事を参考にすればOK
  • 細かい点のみこのスクラップで補足

https://future-architect.github.io/articles/20200701/

構造体の自動生成

こんな感じで自動生成される

// Type definition for component schema "Error"
type Error struct {
    Code    int32  `json:"code"`
    Message string `json:"message"`
}

// Type definition for component schema "NewPet"
type NewPet struct {
    Name string  `json:"name"`
    Tag  *string `json:"tag,omitempty"`
}

// Type definition for component schema "Pet"
type Pet struct {
    // Embedded struct due to allOf(#/components/schemas/NewPet)
    NewPet
    // Embedded fields due to inline allOf schema
    Id int64 `json:"id"`
}

// Type definition for component schema "Pets"
type Pets []Pet

controller相当部分の自動生成

以下のようなinterfaceが自動生成されるので、これを実装していく

type ServerInterface interface {
    //  (GET /pets)
    FindPets(ctx echo.Context, params FindPetsParams) error
    //  (POST /pets)
    AddPet(ctx echo.Context) error
    //  (DELETE /pets/{id})
    DeletePet(ctx echo.Context, id int64) error
    //  (GET /pets/{id})
    FindPetById(ctx echo.Context, id int64) error
}

notes

  • 上記interfaceを実装するメソッドの返り値
    • c.JSON (error型)などをreturnすればOK
    • つまり、responseのbindはしてくれない
  • openapi.ymlのnumber型プロパティはformat: doubleを指定すると、float64型になる
    • formatを指定しないと、float32型になる
  • openapi.ymlでnumber型にrequierdを指定した場合、0は弾かれるか?
  • バリデーションはrequierdと型チェックくらいしかしてくれず、他の細かいバリデーションは自分で実装する必要ある
  • 自動生成されたバリデーション部分は、エラーを返す時にstring型でエラー内容を返している
  • 自動生成コードによるparameterのbind
  • oapi-codegenについて、クライアント(HTTPサーバにリクエストを送るやつ)も自動生成してくれる
    • APIの結合テストとかに使えそう

OapiRequestValidator調査

  • openapi.ymlを基にバリデーションをしてくれる
  • GETと同じ内容をバリデーションしてくれる
    • requierdと型チェックはしてくれる
  • minimum, lengthなどはチェックしてくれない
  • POST/PUTメソッドにおいて、requestBodyの構造体タグにはqueryではなくjsonを使う必要がある
    • 自動生成されたコードではjsonタグを使っているので特に気にする必要なし
  • kin-openapiについて、リポジトリやコードを読み込めばもっと色々機能ありそう
このスクラップは2ヶ月前にクローズされました
作成者以外のコメントは許可されていません