第九十四回 如何打造一个网络框架

文章目录

  • 概念介绍
  • 使用方法
  • 示例代码

我们在上一章回中介绍了"如何mock数据"相关的内容,本章回中将介绍如 何打造一个网络框架闲话休提,让我们一起Talk Flutter吧。

概念介绍

最近在项目中使用dio处理网络相关的内容,有些地方的代码不能利用,有些地方的代码耦合度比较高,因此准备在dio上面封装一层网络层,这些可以优化程序的架构,本章回中介绍的网络构架就是指自己封装的网络层,而不是像dio或者retorfit这样的网络框架。

使用方法

封装网络架构主要包含两方面的内容:网络层和适配层。网络层包含请求数据封装,返回数据封装,错误信息封装和网络操作四部分。适配层使用适配器设计模式的的思想,主要用来适配不同的网络请求库,不同的网络库实现适配层中的内容,然后在网络操作中切换不同的适配器就可以。这样可以减少对网络库的耦合。

示例代码

///封装请求类型,创建请求时只需要实现该类中的三个抽象方法就可以
abstract class BaseRequest {
  ///查询类参数,就是带问号
  ///path类参数,就是在base url后带其它内容

  var pathParams;
  var useHttps = true;
  ///查询参数,通过add方法添加,这个内容就是url中key=value的内容
  Map<String,String> queryParams= Map();
  Map<String,dynamic> headerParams= Map();

  ///返回baseUrl
  String baseUrl () {
    return 'www.base.com';
  }

  ///定义三个抽象方法,子类需要实现这三个方法
  ///是否需要登录
  bool needLogin();
  ///HTTP请求操作的类型
  HttpMethod httpMethod();
  ///HTTP请求的路径
  String path();

  String url() {
    Uri uri;
    var  pathStr = path();

    ///拼接path
    if(pathParams != null) {
      if(path().endsWith("/")) {
        pathStr = "${pathStr}${pathParams}";
      }else {
        pathStr = "${pathStr}/${pathParams}";
      }
    }

    ///区分http和https,uri的方法可以把queryParams中的key和value拼接成key=value&key=value这些的形式
    ///该方法还可以自动在baseUrl前添加http://或者https://
    ///该方法还可以在path和queryParams之间添加一个问号表示查询
    if(useHttps) {
      uri = Uri.https(baseUrl(),pathStr,queryParams);
    }else{
      uri = Uri.http(baseUrl(),pathStr,queryParams);
    }

    // debugPrint(uri.toString());
    return uri.toString();
  }

  BaseRequest add(String key, dynamic object) {
    queryParams[key] = object.toString();

    return this;
  }

  BaseRequest addHeader(String key, dynamic object) {
    headerParams[key] = object.toString();

    return this;
  }

}

///封装网络操作
Future<Response> send<T> (BaseRequest baseRequest) async {

  ///通过不同的适配器切换不同的网络请求库
  // MockAdapter mockAdapter = MockAdapter();
  // var result =  await mockAdapter.send(baseRequest);

  DioAdapter dioAdapter = DioAdapter();
  var result = await dioAdapter.send(baseRequest);
  return result;
 }
///封装adapter,可以适配不同的网络库
abstract class NetworkAdapter {
  Future<Response> send<T>(BaseRequest request);
}

上面的代码中没有封装返回数据和错误信息,这些内容仍然使用dio返回的Response和DioException类型。此外,我感觉请求类型也不需要封装,毕竟dio提供的网络操作方法中已经包含请求相关的参数,而且是命名参数,看上去一目了然,我们可以像前面章回中一样创建一个config类就可以。后来发现dio给的示例中也是推荐使用config类这种方法。不过我的结论是:网络请求的核心内容是跟在baseUrl后面的path和path后面存放请求参数的map.以及请求的参数options,比如请求类型GET,POST,请求时的超时设置等。把撑好这三个方面的内容就可以很好地处理网络请求相关的信息。

看官们,关于"如何打造一个网络框架"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

你可能感兴趣的:(一起Talk,Flutter吧,flutter,dio,网络框架)