Преобразование откликов об ошибках для конкретной модели - флаттер измельчителя
Я использую клиент измельчителя для 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