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

这篇具有很好参考价值的文章主要介绍了第九十四回 如何打造一个网络框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


我们在上一章回中介绍了"如何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,请求时的超时设置等。把撑好这三个方面的内容就可以很好地处理网络请求相关的信息。

看官们,关于"如何打造一个网络框架"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!文章来源地址https://www.toymoban.com/news/detail-613937.html

到了这里,关于第九十四回 如何打造一个网络框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第九十六回 网络综合示例:获取天气信息

    我们在上一章回中介绍了dio库中转换器相关的内容,本章回中将介绍网络综合示例: 获取天气信息 .闲话休提,让我们一起Talk Flutter吧。 我们在前面章回中介绍了网络操作相关的内容,本章回中将综合利用这些内容实现一个获取天气信息的例子。主要包含dio库的使用、网络操

    2024年02月14日
    浏览(49)
  • 第五十四回 高太尉大兴三路兵 呼延灼摆布连环马-AI通过构建并训练CNN网络来进行飞机识别

    呼延灼举荐了百胜将韩滔和天目将彭玘做先锋。 两军对战,韩滔和秦明斗二十回合,呼延灼与林冲斗在一起,花荣与彭玘斗在一处,后彭玘与一丈青扈三娘斗在一起,被扈三娘抓住。 尽管梁山占优,宋江也没有乘胜追击,因为呼延灼带的是连环马,马带马甲,人披铁铠,射

    2024年03月23日
    浏览(42)
  • 第二百六十四回

    我们在上一章回中介绍了SliverPadding组件相关的内容,本章回中将介绍Sliver综合示例.闲话休提,让我们一起Talk Flutter吧。 我们在前面的章回中介绍了各种Sliver相关的组件:SliverList,SliverGrid,SliverAppBar和SliverPadding,本章回将综合使用它们。下面是示例程序的 运行效果图。不过

    2024年01月18日
    浏览(48)
  • 软考高级系统架构设计师系列论文九十四:论计算机网络的安全性设计

    软考高级系统架构设计师:计算机网络

    2024年02月11日
    浏览(72)
  • 第九十七回 自定义评分条

    我们在上一章回中介绍了\\\"网络综合示例\\\"相关的内容,本章回中将介绍如何 自定义评分条 .闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的评分条就是包含多个星星形状的评分条,常见于网上购物后的评价中,相信大家都见过。Flutter没有提供这样的组件,因此我们

    2024年02月15日
    浏览(52)
  • 第九十三回 在Flutter中mock数据

    我们在上一章回中介绍了\\\"在Flutter中解析JSON数据\\\"相关的内容,本章回中将介绍 如何mock数据 .闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的mock数据主要是通过相关的代码模拟服务器返回相关的数据,这些数据可以是正确的数据,也可以是错误的数据。通过mock数据

    2024年02月15日
    浏览(59)
  • 第九十六天学习记录:Linux基础:实用操作Ⅰ

    注:第一张图与学习记录无关,是为了参与CSDN的AI绘图活动 1、Linux某些程序的运行,如果想要强制停止它,可以使用快捷键Ctrl+C中止 2、在命令输入错误时,也可以通过快捷键Ctrl+C快速退出当前输入 1、可以通过快捷键:Ctrl+D,退出账户的登录 2、退出某些特定程序的专属页面

    2024年02月12日
    浏览(55)
  • 第三十四回 石将军村店寄书 小李广梁山射雁-FreeBSD Linux下做图软件GIMP

    宋江花荣并燕顺王矮虎与秦明黄信汇合,攻打清风寨南寨,把刘高一家都喀嚓了。一行人回到山寨聚义厅,燕顺一刀砍了刘高夫人。王矮虎急了,想和燕顺打,被宋江劝道:我救了她,她都叫她丈夫害我,留在你身边只会害了你,并答应以后介绍一个好的。 大家决定去梁山泊

    2024年02月19日
    浏览(49)
  • 数据库管理-第九十三期 19c OCM之路-第四堂(01)(20230719)

    距离上一期19c OCM之路已经过去了整整8天了,这中间发生的事情详见第九十二期。本期来到第四堂 Performance management 性能管理,但是一开始需要把上一堂的一些内容做一些调整和补遗。 Additional configuration 其他配置 在上一堂的其他配置中,我是把并行相关内容放过去了,但是

    2024年02月16日
    浏览(40)
  • 和鲸社区数据分析每周挑战【第九十三期:特斯拉充电桩分布分析】

    本周的挑战内容为: 特斯拉充电桩分布分析 大家可以去关于特斯拉超级充电站数据集(全球)的探索在线或者下载到本地进行运行这个项目。 数据集来源本次活动提供: 1、获取拥有最多充电站的 10 个国家 我们不难发现美国共有超过1100座特斯拉充电站,是世界上特斯拉充

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包