将错误响应转换为特定模型 - 斩波器颤振
Posted
技术标签:
【中文标题】将错误响应转换为特定模型 - 斩波器颤振【英文标题】:Convert error responses to a specific Model - Chopper flutter 【发布时间】:2020-09-01 12:47:06 【问题描述】:我使用 chopper 客户端发出 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"
我关注this 并为我的回复创建一个 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),
);
如何处理错误响应?
【问题讨论】:
这是我的问题的回答:) github.com/lejard-h/chopper/issues/141 【参考方案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
【讨论】:
以上是关于将错误响应转换为特定模型 - 斩波器颤振的主要内容,如果未能解决你的问题,请参考以下文章
如何将 fetch API 响应转换为 TypeScript 中的特定类型?
计算 Web 音频 API 滤波器在特定频率和 Q 因子下的响应
使用颤振在 UI 中进行 POST 调用后显示来自 json 响应的特定数据
如何将此 JSON 格式转换为模型类并使用改造将响应转换为列表