首先我们去github 找到dio的介绍,稍微看下会发现确实是一个很强大的网络工具, 我们现在介绍下如何把它封装成我们项目常用的单例
https://github.com/flutterchina/dio/blob/master/README-ZH.md
yaml引入插件按照github介绍就好
这里我们注意, Dart语言不支持反射机制。所以我们将一个数据映射成entity需要用到这个插件。
image.pngimport 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
//import 'package:fluttertoast/fluttertoast.dart';
class HttpGo {
static const String _GET = "get";
static const String _POST = "post";
static const String _DATA = "data";
static const String _CODE = "errCode";
static HttpGo _instance;
final String _baseURL = "http://www.dtworkroom.com/doris/1/2.0.0/";
Dio _dio;
static HttpGo getInstance() {
if (_instance == null) {
_instance = HttpGo();
}
return _instance;
}
HttpGo() {
_dio = Dio(
BaseOptions(
baseUrl: _baseURL,
connectTimeout: 5000,
receiveTimeout: 100000,
// headers: {"user-agent": "dio", "api": "1.0.0"},
contentType: ContentType.json.toString(),
responseType: ResponseType.plain),
);
_addHttpInterceptor(); //添加请求之前的拦截器
}
//get请求
get(String url, Function successCallBack, {Map<String, dynamic> params, Function errorCallBack}) async {
_requestHttp(url, successCallBack, _GET, params, errorCallBack);
}
//post请求
post(String url, Function successCallBack, {Map<String, dynamic> params, Function errorCallBack}) async {
_requestHttp(url, successCallBack, _POST, params, errorCallBack);
}
_requestHttp(String url, Function successCallBack, [String method, Map<String, dynamic> params, Function errorCallBack]) async {
String errorMsg = '';
int code;
try {
Response response;
if (method == _GET) {
if (params != null && params.isNotEmpty) {
response = await _dio.get(url, queryParameters: params);
} else {
response = await _dio.get(url);
}
} else if (method == _POST) {
if (params != null && params.isNotEmpty) {
response = await _dio.post(url, data: params);
} else {
response = await _dio.post(url);
}
}
code = response.statusCode;
if (code != 200) {
errorMsg = '错误码:' + code.toString() + ',' + response.data.toString();
_error(errorCallBack, errorMsg);
return;
}
// String dataStr = json.encode(response.data);
Map<String, dynamic> dataMap = json.decode(response.data);
if (dataMap != null && dataMap[_CODE] != 0) {
errorMsg = '错误码:' + dataMap[_CODE].toString() + ',' + response.data.toString();
_error(errorCallBack, errorMsg);
return;
}
if (successCallBack != null) {
successCallBack(dataMap[_DATA]);
}
} catch (exception) {
_error(errorCallBack, exception.toString());
}
}
_error(Function errorCallBack, String error) {
// Fluttertoast.showToast(msg: error.toString(), toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER);
if (errorCallBack != null) {
errorCallBack(error);
}
}
_addHttpInterceptor() {
_dio.interceptors.add(InterceptorsWrapper(onRequest: (RequestOptions options) async {
// 在请求被发送之前做一些事情
return options; //continue
// 如果你想完成请求并返回一些自定义数据,可以返回一个`Response`对象或返回`dio.resolve(data)`。
// 这样请求将会被终止,上层then会被调用,then中返回的数据将是你的自定义数据data.
//
// 如果你想终止请求并触发一个错误,你可以返回一个`DioError`对象,或返回`dio.reject(errMsg)`,
// 这样请求将被中止并触发异常,上层catchError会被调用。
}, onResponse: (Response response) async {
// 在返回响应数据之前做一些预处理
return response; // continue
}, onError: (DioError e) async {
// 当请求失败时做一些预处理
return e; //continue
}));
}
}
直接贴上我封装的dio 单例类。
创建一个DioTest类
import 'package:guoteng/generated/json/base/json_convert_content.dart';
import 'package:guoteng/util/dio/HttpGo.dart';
import 'model/entity_info_entity.dart';
main() {
HttpGo.getInstance().get("/test", (json) {
EntityInfoEntity entity = JsonConvert.fromJsonAsT<EntityInfoEntity>(json);
print(entity.address);
});
}
这里的EntityInfoEntity就是通过JsonBeanFactory来映射的。
代码编写完成~! 效果如下
image.png
网友评论