`openapi-genrator`の`dart-dio-next`で生成したコードでリクエストパラメーターを生成してPOSTリクエストを行う


書くこと

  • openapi-generatorのdart-dio-nextで生成したコードでリクエストパラメーターを生成する
  • 生成したリクエストパラメーターを使いPOSTリクエストを行う
  • 上記の周辺コードの解説

書かないこと

  • APIのパスを定義した完全なOpenAPI定義について
  • openapi-generatorの実行環境について
  • OpenAPIについて

前提条件

OAS

OASは以下のようにユーザ情報をpostで作成する定義したが存在するとします。

post:
  tags:
    - Users
  summary: Create user
  operationId: postUser
  requestBody:
    required: true
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/user'
  responses:
    '200':
      description: "OK"

components:
  schemas:
    user:
      type: object
      required:
        - name
        - email
      properties:
        name:
          type: string
          example: mike
          description: user name
        email:
          type: string
          format: email
          example: [email protected]
          description: mail addrress

dartパッケージの自動生成

以下のように-gオプションの値にdart-dio-nextを指定してopenapi-generatorgenerateを 実行します。

openapi-generator generate \
  -i workspace/openapi/openapi.yml \
  -g dart-dio-next \
  -o workspace/dio_client \
  --additional-properties=disallowAdditionalPropertiesIfNotPresent=false,pubName=dio_client,pubLibrary=dio_client

dio_clientに移動してbuild_runnerを実行させます。
※手元にdartのランタイムが入っていないのでflutterコマンドで実行しています。

cd dio_client
flutter pub get
flutter packages pub run build_runner build 

生成されたソースコードの確認

dio_client/パッケージが作成されます

$ tree dio_client/lib 
dio_client/lib
├── dio_client.dart
└── src
    ├── api
    │   └── users_api.dart
    ├── api.dart
    ├── api_util.dart
    ├── auth
    │   ├── api_key_auth.dart
    │   ├── auth.dart
    │   ├── basic_auth.dart
    │   ├── bearer_auth.dart
    │   └── oauth.dart
    ├── date_serializer.dart
    ├── model
    │   ├── date.dart
    │   ├── user.dart
    │   └── user.g.dart
    ├── serializers.dart
    └── serializers.g.dart

実際にリクエストを送るために使用する部分は以下の二つです。

  • dio_client/lib/src/api/users_api.dartに定義されているpostUser
  • dio_client/lib/src/model/user.dartに定義されているUserclass
dio_client/lib/src/api/users_api.dart
Future<Response<void>> postUser({
    required User user,
    CancelToken? cancelToken,
    Map<String, dynamic>? headers,
    Map<String, dynamic>? extra,
    ValidateStatus? validateStatus,
    ProgressCallback? onSendProgress,
    ProgressCallback? onReceiveProgress,
  })
dio_client/lib/src/model/user.dart
abstract class User implements Built<User, UserBuilder> {
    /// user name
    @BuiltValueField(wireName: r'name')
    String get name;

    /// mail addrress
    @BuiltValueField(wireName: r'email')
    String get email;

    User._();

    @BuiltValueHook(initializeBuilder: true)
    static void _defaults(UserBuilder b) => b;

    factory User([void updates(UserBuilder b)]) = _$User;

    @BuiltValueSerializer(custom: true)
    static Serializer<User> get serializer => _$UserSerializer();
}

使い方

  1. postUserは引数にUserが必要なのでuserを作成します。
  2. User classのコンストラクタは引数にUserBuilder関数を受け取るので、関数を使用して値の初期化を行います。
  3. 生成されたDioClientからusersのAPIクライアントを取得してpostUserを呼び出します。
final User user = User(
  (UserBuilder b) => {
    b.name = "mike",
    b.email = "[email protected]"
  }
)

DioClient.getUsersApi().postUser(user)

環境

  • openapi-generator-cli v5.3.1
  • Dart SDK version: 2.16.0