dio是flutter比较经常使用的网络请求框架,下面是对dio简单封装,便于之后使用git
dependencies
dio: ^2.1.0
复制代码
代码说明详见注释github
import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:kuaixin/network/Api.dart';
var httpUtil = HttpUtil(
baseUrl:Api.baseUrl,
header:headers
);
var httpUtilJson = HttpUtil(
baseUrl:Api.baseUrl2,
header:headersJson
);
//普通格式的header
Map<String, dynamic> headers = {
"Accept":"application/json",
// "Content-Type":"application/x-www-form-urlencoded",
};
//json格式的header
Map<String, dynamic> headersJson = {
"Accept":"application/json",
"Content-Type":"application/json; charset=UTF-8",
};
class HttpUtil {
Dio dio;
BaseOptions options;
HttpUtil({String baseUrl= Api.baseUrl,Map<String, dynamic> header}) {
print('dio赋值');
// 或者经过传递一个 `options`来建立dio实例
options = BaseOptions(
// 请求基地址,通常为域名,能够包含路径
baseUrl: baseUrl,
//链接服务器超时时间,单位是毫秒.
connectTimeout: 10000,
//[若是返回数据是json(content-type),dio默认会自动将数据转为json,无需再手动转](https://github.com/flutterchina/dio/issues/30)
responseType:ResponseType.plain,
/// 响应流上先后两次接受到数据的间隔,单位为毫秒。若是两次间隔超过[receiveTimeout],
/// [Dio] 将会抛出一个[DioErrorType.RECEIVE_TIMEOUT]的异常.
/// 注意: 这并非接收数据的总时限.
receiveTimeout: 3000,
headers: header,
);
dio = new Dio(options);
dio.interceptors.add(CookieManager(CookieJar()));
}
get(url, {data, options, cancelToken}) async {
print('get请求启动! url:$url ,body: $data');
Response response;
try {
response = await dio.get(
url,
cancelToken: cancelToken,
);
print('get请求成功!response.data:${response.data}');
} on DioError catch (e) {
if (CancelToken.isCancel(e)) {
print('get请求取消! ' + e.message);
}
print('get请求发生错误:$e');
}
return response.data;
}
post(url, {data, options, cancelToken}) async {
print('post请求启动! url:$url ,body: $data');
Response response;
try {
response = await dio.post(
url,
data: data,
);
print('post请求成功!response.data:${response.data}');
} on DioError catch (e) {
if (CancelToken.isCancel(e)) {
print('post请求取消! ' + e.message);
}
print('post请求发生错误:$e');
}
return response.data;
}
}
复制代码
以前有个bug一直困扰我好久,获取到的json数据key,value都不带引号,致使解析失败,又来加上responseType:ResponseType.plain
这句就ok了json
String url = Api.discover;
var jsonString = await httpUtil.get(url);
复制代码
这里jsonString即是一个json格式的数据了,还须要将其转化为实体类须要用到另外一个开源库json_serializablebash