文章目录
- 概念介绍
- 使用方法
- 示例代码
我们在上一章回中介绍了"如何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();///返回baseUrlString baseUrl () {return 'www.base.com';}///定义三个抽象方法,子类需要实现这三个方法///是否需要登录bool needLogin();///HTTP请求操作的类型HttpMethod httpMethod();///HTTP请求的路径String path();String url() {Uri uri;var pathStr = path();///拼接pathif(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,请求时的超时设置等。把撑好这三个方面的内容就可以很好地处理网络请求相关的信息。
看官们,关于"如何打造一个网络框架"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!