1

httpリクエストを作成するためにチョッパークライアントを使用します

API を作成しましたが、応答の種類が必要です: この形式での成功:

{
    "id": 1,
    "title": "Most Popular phone in the world !",
    "image": "/uploads/poll_images/D6voYQriTCSZpMIe.jpg",
    "submits": 2,
    "views": 52,
    "description": "There are many phone on the world, if you are buyer which one will you buy ?",
    "date": {
        "date": "2020.4.13",
        "time": "12:02"
    },
    "comments": 0,
    "options": [
        {
            "id": 1,
            "position": 1,
            "title": "iPhone 11 pro Max",
            "votes": 1
        },
        {
            "id": 2,
            "position": 2,
            "title": "Samsung S20+ Ultra",
            "votes": 1
        }
    ],
    "selected": 2
}

ステータス コード 400 と次の形式のエラー応答:

{
    "msg": "Your login session expired! please login again"
}

これに従って、応答用の buildValue コンバーターを作成します。

すべて問題なく、応答はデータモデルに正常に変換されますが、エラー応答を処理する方法がわかりません!

これは私の作成方法です:

static ApiService create() {
    if (instance == null) {
      instance = ChopperClient(
        baseUrl: Commons.baseURL,
        services: [_$ApiService()],
        interceptors: [HttpLoggingInterceptor()],
        converter: BuiltValueConverter(),
        errorConverter: BuiltValueConverter(),
      );
    }
    return _$ApiService(instance);
  }

リクエスト方法:

@Get(path: 'poll/getSingle/{id}')
  Future<Response<PollSingle>> getPollSingle({@Path('id') int pollId , @Query('client_id') int clientId});

構築値コンバーター:

class BuiltValueConverter extends JsonConverter {
  final jsonSerializers =
      (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

  T _deserializer<T>(dynamic value) => jsonSerializers.deserializeWith(
        jsonSerializers.serializerForType(T),
        value,
      );

  @override
  Response<ResultType> convertResponse<ResultType, Item>(Response response) {
    final jsonResponse = super.convertResponse(response);
    final body = _decode<Item>(jsonResponse.body);

    return jsonResponse.copyWith<ResultType>(body: body);
  }

  dynamic _decode<T>(entity) {
    print(entity);
    if (entity is T) return entity;

    try {
      if (entity is List) return _deserializeListOf<T>(entity);
      return _deserializer<T>(entity);
    } catch (e) {
      print(e);
      return null;
    }
  }

  BuiltList<T> _deserializeListOf<T>(Iterable value) => BuiltList(
        value.map((value) => _deserializer<T>(value)).toList(growable: true),
      );
}

エラー応答を処理するにはどうすればよいですか?

4

1 に答える 1