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

# 書くこと

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

# 書かないこと

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

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

```yaml
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: hoge@huga.com
          description: mail addrress
```

## dartパッケージの自動生成

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


```bash
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/`パッケージが作成されます

```bash
$ 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`に定義されている`User`class


```dart: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,
  })
```

```dart: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`を呼び出します。

```dart
final User user = User(
  (UserBuilder b) => {
    b.name = "mike",
    b.email = "hoge@huga.com"
  }
)

DioClient.getUsersApi().postUser(user)
```

# 環境

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