LoginSignup
3
0

More than 1 year has passed since last update.

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

Posted at

書くこと

  • 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: hoge@huga.com
          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 = "hoge@huga.com"
  }
)

DioClient.getUsersApi().postUser(user)

環境

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0