将错误响应转换为特定模型 - 斩波器颤振

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 格式转换为模型类并使用改造将响应转换为列表

Angular:Typescript 将 JSON 响应转换为对象模型不起作用

滤波器相关知识