Blog スタッフブログ

Swift システム開発

[Swift]Swagger-CodegenでAPI仕様書からコードを自動生成してみた

Swift

新年あけましておめでとうございます。株式会社MIXシステム開発担当のBloomです。

今回はSwagger-Codegenを利用してOpenAPIに基づきYAMLで記述されたAPI仕様書からSwiftのコードを自動生成してみます。

Swagger-Codegenの導入

Swagger-Codegen -GitHub

Installationの項から環境に適したインストール方法を選びましょう。今回はHomebrewを利用し下記コマンドでインストールを行なった形で進めていきます。

brew install swagger-codegen

コード生成

では、実際にコードを生成してみましょう。こちらはサンプル用に用意したYAMLとなります。

openapi: 3.0.0
info:
  title: Sample API
  version: 0.1.0
servers:
  - url: http://localhost:8000/api/
paths:
  /sample:
    post:
      summary: サンプル
      requestBody:
        content:
          "multipart/form-data":
            schema:
              properties:
                text:
                  type: string
                  example: "text"
                number:
                  type: integer
                  example: 1
        required: true
      responses:
        "200":
          description: |
            Succeed
          content:
            "application/json":
              schema:
                properties:
                  text:
                    type: string
                    example: "戻り値テキスト"
                  number:
                    type: integer
                    example: 2
  /lists:
    get:
      summary: サンプル一覧
      responses:
        "200":
          description: |
            Succeed
          content:
            "application/json":
              schema:
                properties:
                  samples:
                    type: array
                    items:
                      allOf:
                        - $ref: "#/components/schemas/SampleModel"
                        - type: object
                          properties:
                            sample_count:
                              type: integer
                              example: 80
        "500":
          $ref: "#/components/responses/UnexpectedException"
  /sample/upload:
    post:
      summary: アップロード
      description: |
        サンプル
      requestBody:
        content:
          "multipart/form-data":
            schema:
              properties:
                samples:
                  type: array
                  items:
                    $ref: "#/components/schemas/SampleModel"
        required: true
      responses:
        "200":
          description: |
            Succeed
        "500":
          $ref: "#/components/responses/UnexpectedException"
components:
  schemas:
    SampleModel:
      type: object
      properties:
        id:
          type: integer
          format: int64
          example: 1
        name:
          type: string
          example: "サンプル名"
        created:
          type: string
          format: date-time
          example: "2023-01-10 12:00:00"
  responses:
    UnexpectedException:
      description: Unexpected exception

こちらのファイルを保存して下記コマンドを実行します。出力先はoutputディレクトリの指定になります。

swagger-codegen generate -i sample.yaml --lang swift5 -o output 

このコマンドを実行することでoutputディレクトリにコードが生成されます。生成されたコードの中から、APIを実行したいSwaggerClientディレクトリを丸ごと投入しましょう。

コードの他にCartfileも生成されていますが、中身はAlamofire 4.9.0を指定する内容なので別途SwiftPMやCarthageで導入しておきましょう。(CarthageでAlamofire5からダウングレードを行う場合、先にCheckoutsからAlamofireを削除しておかないとビルドエラーが発生するようです。)

上記サンプルで生成するとDefaultAPIクラスからAPIをコール可能となります。コード例を記載します。

DefaultAPI.samplePost(text: "text", number: 1) { data, error in
    if let data = data {
        print(data.text)
        print(data.number)
    }
    else {
        print(error)
    }
}
DefaultAPI.listsGet { data, error in
    if let data = data {
        print(data.samples)
    }
    else {
        print(error)
    }
}
DefaultAPI.sampleUploadPost(samples: []) { data, error in
    if data != nil  {
        print("succeed")
    }
    else {
        print(error)
    }
}

DefaultAPIクラスはSwaggerClient\Classes\Swaggers\APIs\DefaultAPI.swiftで、レスポンスのモデルはSwaggerClient\Classes\Swaggers\Modelsで定義されています。クラス名は自動生成される部分もあるため場合によって適宜書き換えて利用しましょう。

API自体のエントリポイントはSwaggerClient\Classes\Swaggers\APIs.swiftで定義されています。こちらも必要に応じて書き換えを行いましょう。

これでAPI仕様書から直接コードを生成することができました。良かったですね。

参考文献

Swagger-Codegen -GitHub