flutterパッケージdio+json汎用解析

7453 ワード

例を通して比較した
HttpClient,http dio,github star      ,        dio    ;
json_serializable+json_annotation    json     ,       ;

私が選んだのはhttps://javiercbk.github.io/json_to_dart/ベースクラスjsonをdart classエンティティクラスに生成し、
flutter 封装dio+json泛型解析_第1张图片
その他のクラスは、プラグインFlutterJsonBeanFactoryを使用してdart classエンティティークラスを生成します.プラグインのインストール後、IDEを再起動してください.
pubspec.yaml dio依存性の追加
dio: ^3.0.9

ネットワークツールクラス
import 'dart:convert';
import 'dart:io';

import 'package:dio/dio.dart';

class HttpManager {
  static HttpManager _instance;

  static HttpManager getInstance() {
    if (_instance == null) {
      _instance = new HttpManager();
    }
    return _instance;
  }

  HttpManager() {
    dio = createInstance();
  }

  /// global dio object
  static Dio dio;

  /// default options
  static const String _BASE_URL = "https://www.wanandroid.com/";
  static const int _CONNECT_TIMEOUT = 15000;
  static const int _RECEIVE_TIMEOUT = 15000;

  /// http request methods
  static const String GET = 'get';
  static const String POST = 'post';
  static const String PUT = 'put';
  static const String PATCH = 'patch';
  static const String DELETE = 'delete';

  get(
      String url, FormData param, Function onSuccess, Function onError) async {
    requestHttp(
      url,
      param: param,
      method: GET,
      onSuccess: onSuccess,
      onError: onError,
    );
  }

  post(
      String url, FormData param, Function onSuccess, Function onError) async {
    requestHttp(
      url,
      param: param,
      method: POST,
      onSuccess: onSuccess,
      onError: onError,
    );
  }

  /// T is Map  or List
  static requestHttp(
    String url, {
    param,
    method,
    Function(T map) onSuccess,
    Function(String error) onError,
  }) async {
    dio = createInstance();
    try {
      Response response = await dio.request(
        url,
        data: param,
        options: new Options(method: method),
      );
      if (response.statusCode == HttpStatus.ok) {
        onSuccess(json.decode(response.data));
      } else {
        onError("【statusCode】${response.statusCode}");
      }
    } on DioError catch (e) {
      ///           
      print("【    】${e.toString()}");
      onError(e.toString());
    }
  }

  ///    dio     
  static Dio createInstance() {
    if (dio == null) {
      ///     :    、      、      
      var options = new BaseOptions(
        baseUrl: _BASE_URL,
        connectTimeout: _CONNECT_TIMEOUT,
        receiveTimeout: _RECEIVE_TIMEOUT,
        responseType: ResponseType.plain,
//        contentType: Headers.jsonContentType,
      );
      dio = new Dio(options);
      dio.interceptors.add(new LogInterceptors());
    }
    return dio;
  }

//  /// request method
//  static Future request(
//      String url, {
//        param,
//        method,
//        Function onSuccess,
//        Function onError,
//      }) async {
////    param = param ?? {};
//
//    /// restful     
//    /// /gysw/search/hist/:user_id        user_id=27
//    ///      url       /gysw/search/hist/27
//    param.forEach((key, value) {
//      if (url.indexOf(key) != -1) {
//        url = url.replaceAll(':$key', value.toString());
//      }
//    });
//
//    dio = createInstance();
//    var result;
//    try {
//      Response response = await dio.request(
//        url,
//        data: param,
//        options: new Options(method: method),
//      );
//      result = json.decode(response.data);
//      if (response.statusCode == HttpStatus.ok) {
//        onSuccess(result);
//      } else {
//        onError("【statusCode】${response.statusCode}");
//      }
//    } on DioError catch (e) {
//      ///           
//      print("【    】${e.toString()}");
//      onError(e.toString());
//    }
//    return result;
//  }
  ///    dio   
  static clear() {
    dio = null;
  }
}

///     
class LogInterceptors extends InterceptorsWrapper {
  @override
  Future onRequest(RequestOptions options) {
    print("【  baseUrl】${options.baseUrl}");
    print("【  path】${options.path}");
    print("【  headers】${options.headers.toString()}");
    //todo     
    print("【    】${options.data.toString()}");
    return super.onRequest(options);
  }

  @override
  Future onResponse(Response response) {
    print("【  statusCode】${response.statusCode}");
    print("【  headers】${response.headers.toString()}");
    print("【  extra】${response.extra.toString()}");
    print("【  data】${response.data.toString()}");
    return super.onResponse(response);
  }

  @override
  Future onError(DioError err) {
    print(err.toString());
    print(err.response?.toString());
    return super.onError(err);
  }
}

対応するベースクラス定義
///convert FlutterJsonBeanFactory    
class BaseEntity {
  T data;
  int errorCode;
  String errorMsg;

  BaseEntity({this.data, this.errorCode, this.errorMsg});

  BaseEntity.fromJson(Map json) {
    if (json['data'] != null&&json['data']!='null') {
      data = JsonConvert.fromJsonAsT(json['data']);
    }
    errorCode = json['errorCode'];
    errorMsg = json['errorMsg'];
  }

  Map toJson() {
    final Map data = new Map();
    if (this.data != null) {
      data['data'] = this.data;
    }
    data['errorCode'] = this.errorCode;
    data['errorMsg'] = this.errorMsg;
    return data;
  }
}

flutter 封装dio+json泛型解析_第2张图片
JsonConvert.fromJsonAsT(json['data']);  FlutterJsonBeanFactory   ,   Object List      

使用
HttpManager.getInstance().get("banner/json", null, (data) {
      BaseEntity> baseEntity = BaseEntity.fromJson(data);
      baseEntity.data.forEach((element) {
        print(element.imagePath);
      });
    }, (error) {
      ToastUtil.showToastCenter(error);
    });

postリクエスト
var map = Map();
    map["username"] = "    ";
    map["password"] = "xxxxx";
    FormData formData = FormData.fromMap(map);
    HttpManager.getInstance().post("user/login", formData, (data) {
      BaseEntity baseModel = BaseEntity.fromJson(data);
      print("  ${baseModel.errorMsg}");
    }, (error) {
      ToastUtil.showToastCenter(error);
    });

コードアドレスhttps://gitee.com/jiangzhuqingfeng/flutter_demo.git