Преобразование откликов об ошибках для конкретной модели - флаттер измельчителя

Я использую клиент измельчителя для 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),
      );
}

как я могу обрабатывать сообщения об ошибках?

1 ответ

Оказывается, этого действительно легко добиться. Потратил 2 дня, пытаясь понять это. Итак, в вашемPollSingle добавьте дополнительное сообщение ответа сервера как

@nullable
String get msg;

Затем, где бы вы ни обрабатывали свою логику, проверьте, был ли запрос сервера успешным или нет. Предполагая, что ваш ответ хранится вresponse переменная,

var response = ApiService.create().getPollSingle('id', 'client_id');
if (! response.isSuccessful && response.statusCode == 400) {
    var errors = response.error as PollSingle;
    print(errors);
}

Ты должен получить

PollSingle {
   msg=Your login session expired! please login again,
}

Так что вы можете легко сделать errors.msg

Другие вопросы по тегам