/**
* create by wanghao
* 2019/8/7 18:47
**/
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flustars/flustars.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'dart:convert' as convert;
class HttpGo {
static final String GET = "get";
static final String POST = "post";
static final String DATA = "data";
static final String CODE = "code";
static final String MSG = "msg";
Dio dio;
static HttpGo _instance;
static HttpGo getInstance() {
if (_instance == null) {
_instance = HttpGo();
}
return _instance;
}
HttpGo() {
dio = Dio(Options(
/*baseUrl: "http://192.168.5.6:8085",*/
headers: {
'content-type': 'application/json',//
'Authorization': SpUtil.getString("token")},//没有的话请注释掉
connectTimeout: 5000,
receiveTimeout: 100000,
responseType: ResponseType.JSON,
));
}
//get请求
get(String url, Function successCallBack,
{params, Function errorCallBack}) async {
_requstHttp(url, successCallBack, GET, params, errorCallBack);
}
//post请求
post(String url, Function successCallBack, FormData formData,
Function errorCallBack) async {
_requstHttp(url, successCallBack, POST, formData, errorCallBack);
}
//post请求
post1(String url, Function successCallBack, Map<String,dynamic> formData,
Function errorCallBack) async {
_requstHttp1(url, successCallBack, POST, formData, errorCallBack);
}
_requstHttp(String url, Function successCallBack,
[String method, FormData params, Function errorCallBack]) async {
String errorMsg = '';
int code;
try {
Response response;
_addStartHttpInterceptor(dio); //添加请求之前的拦截器
if (method == GET) {
if (params != null && params.isNotEmpty) {
response = await dio.get(url, data: 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(dataStr);
if (dataMap != null && dataMap[CODE] != 0) {
errorMsg =
'错误码:' + dataMap[CODE].toString() + ',' + dataMap[MSG].toString();
_error(errorCallBack, errorMsg);
return;
}
if (successCallBack != null) {
successCallBack(dataMap[DATA]);
}
} catch (exception) {
_error(errorCallBack, exception.toString());
}
}
_requstHttp1(String url, Function successCallBack,
[String method, Map<String,dynamic> params, Function errorCallBack]) async {
String errorMsg = '';
int code;
try {
Response response;
_addStartHttpInterceptor(dio); //添加请求之前的拦截器
if (method == GET) {
if (params != null && params.isNotEmpty) {
response = await dio.get(url, data: 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);
print("here is result" + dataStr);
Map<String, dynamic> dataMap = json.decode(dataStr);
if (dataMap != null && dataMap[CODE] != 0) {
if(dataMap[CODE] != 11) {
errorMsg =
'错误码:' + dataMap[CODE].toString() + ',' + dataMap[MSG].toString();
} else {
errorMsg = dataMap[MSG].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);
}
}
_addStartHttpInterceptor(Dio dio) {
dio.interceptor.request.onSend = (Options options) {
// 在请求被发送之前做一些事情 比如加密的一些操作 或者添加token等参数 对head 或者请求参数进行加工处理
Map<String, dynamic> headers = options.headers;
Map<String, dynamic> body = options.data;
/*request['token'] = '1111111111';
headers['addParam'] = 'aaaaaaaaaaaaaaa';*/
return options;
};
}
}
使用方法:
HttpGo.getInstance().post1(
Constants.login_url,
(result) {
String data = result.toString();
print("AAAAA" + data);
// bean = UserInfoBean.fromJson(result);
Anim.goNextReplace(context, BasePage());
},
Tool.getParams1(dataStr),
(error) {
print("error:===>" + error);
Tool.showToastShort(error.toString());
});
其中的dataStr 是请求的字段:
var data = {"pageSize":100,"pageIndex":_page}; String dataStr = convert.jsonEncode(data);
其中post1和post的区别主要是请求字段数据类型的区别一个是
Map<String,dynamic>
另一个是
FormData
主要看服务器那边要求是那种,另外服务器返回的数据在HttpGo中已经将最外层解析了,所以post或post1方法里返回的result是data字段里的数据而且数据类型是
Map<String, dynamic>
的而不是String类型的,如果是集合的话是一个Map集合可以放到list里面解析如下:
List responseJson = result;
List<CollectItemBean> list = responseJson.map((m) => CollectItemBean.fromJson(m)).toList();