Commit 9181a728 authored by Q14's avatar Q14

封装网络库请求

parent b0695e84
import 'package:flutter/material.dart';
import '../netWork/DioUtil.dart';
// import '../netWork/DioUtil.dart';
// import 'package:dio/dio.dart';
// import 'dart:async';
class HomePage extends StatefulWidget {
@override
......@@ -6,15 +10,38 @@ class HomePage extends StatefulWidget {
}
class _HomePageState extends State<HomePage> {
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that
// something has changed in this State, which causes it to rerun
// the build method below so that the display can reflect the
// updated values. If we changed _counter without calling
// setState(), then the build method would not be called again,
// and so nothing would appear to happen.
});
void _incrementCounter() async {
// print('Come------');
// // print('objectaaa');
// DioUtil().get('/api/v1/suggestion',
// data: {
// 'content': 'aaa',
// // 'phone': '18601965003'
// },
// errorCallback: (statusCode) {
// print('NNNNNNNN');
// print('Http error code : $statusCode');
// }
// ).then((data) {
// print('AAAAAAAA');
// print('Http response: $data');
// });
// try {
// Response response = await Dio().post("https://earth.iyanzhi.com/api/v1/suggestion", queryParameters: {'content': 'aaa','phone': '18601965003'
// });
// print(response);
// } catch (e) {
// print(e);
// }
// FormData formData = new FormData.from({
// "username": "username",
// "password": "password",
// });
DioUtil().requestR(Method.post, "/api/v1/suggestion",data: {"content": "add", "phone": "aaa"});
}
@override
......
import 'package:dio/dio.dart';
import 'dart:async';
import 'dart:convert';
class NetworkSuccess {
NetworkSuccess({this.data});
final Map data;
Map get dataMap{
if (this.data.runtimeType == Map) {
return data;
}else return null;
}
}
class NetworkError {
NetworkError({this.error});
final Map error;
int get errorCode{
if (this.error.runtimeType == Map) {
return error['errorCode'];
}else return null;
}
}
class ALURL {
ALURL({this.api}) : assert(api != null);
final String api;
static final baseUrl = 'https://earth.iyanzhi.com';
String get originUrl => (baseUrl + api);
}
class ALNetworkHeader {
BaseOptions get options{
BaseOptions option = BaseOptions();
option.headers =this.header;
return option;
}
Map<String, dynamic> get header{
return {
'Host': 'earth.igengmei.com',
'Accept': '*/*',
'Cookie': '_gm_token=fb20fe1550833249; sessionid=qntnckxv4n4nzrl49jmaesc5ylru92yt; _gtid=ae355f92310911e9905700163e0a7a995288',
'User-Agent': 'GMAlpha/1.3.0 (iPhone; iOS 12.1.2; Scale/2.00)',
'Accept-Language': 'en-CN;q=1, zh-Hans-CN;q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive'
};
}
Map<String, dynamic> get params {
return {
'platform': 'iPhone',
'os_version':'12.1.2',
'version':'1.3.0',
'model':'iPhone%206s',
'release':'0',
'idfa':'119A3567-6C81-40EA-A3ED-A63F7DCAD86B',
'idfv':'78BE2D94-7252-4C18-A816-2CEE6350B076',
'device_id':'119A3567-6C81-40EA-A3ED-A63F7DCAD86B',
'channel':'App%20Store',
'app_name':'gengmeiios',
'current_city_id':'worldwide',
'lat':'0',
'lng':'0',
'is_WiFi':'(null)',
'phone_id':'iPhone8'
};
}
}
// 管理任务
class ALNetworkTask {
ALNetworkTask({this.serviceInstance,this.networkContext, this.response});
final Dio serviceInstance;
final ALNetwork networkContext;
Response response;
void cancle(String api) {
// CancelToken
}
}
typedef NetworkSuccessCallback = void Function(NetworkSuccess success);
typedef NetWorkErrorCallback = void Function(NetworkError error);
typedef ProgressCallback = void Function(int count, int total);
class ALNetwork {
/**
* 任务映射表
* 外部可以通过 ALNetwork.taskMap 获取
*/
static Map<String, ALNetworkTask> taskMap = {};
const ALNetwork(
{this.success,
this.error,
this.progress,
this.api,
this.params,
this.formData}) : assert(api != null);
final NetworkSuccessCallback success;
final NetWorkErrorCallback error;
final ProgressCallback progress;
final String api;
final Map params;
final FormData formData;
ALURL get url => ALURL(api: this.api);
///post
Future<void> post() async{
ALNetworkTask task = _initNetworkEngin();
task.response = await task.serviceInstance.post(this.url.originUrl, data: this.params);
_handleNetworkService(task.response);
}
/**
* FormData formData = new FormData.from({
"name": "simon",
"age": 25,
});
*/
Future<void> postFormData() async{
ALNetworkTask task = _initNetworkEngin();
task.response = await task.serviceInstance.post(this.url.originUrl, data: this.formData);
_handleNetworkService(task.response);
}
// import 'package:dio/dio.dart';
// import 'dart:async';
// import 'dart:convert';
// class NetworkSuccess {
// NetworkSuccess({this.data});
// final Map data;
// Map get dataMap{
// if (this.data.runtimeType == Map) {
// return data;
// }else return null;
// }
// }
// class NetworkError {
// NetworkError({this.error});
// final Map error;
// int get errorCode{
// if (this.error.runtimeType == Map) {
// return error['errorCode'];
// }else return null;
// }
// }
// class ALURL {
// ALURL({this.api}) : assert(api != null);
// final String api;
// static final baseUrl = 'https://earth.iyanzhi.com';
// String get originUrl => (baseUrl + api);
// }
// class ALNetworkHeader {
// BaseOptions get options{
// BaseOptions option = BaseOptions();
// option.headers =this.header;
// return option;
// }
// Map<String, dynamic> get header{
// return {
// 'Host': 'earth.igengmei.com',
// 'Accept': '*/*',
// 'Cookie': '_gm_token=fb20fe1550833249; sessionid=qntnckxv4n4nzrl49jmaesc5ylru92yt; _gtid=ae355f92310911e9905700163e0a7a995288',
// 'User-Agent': 'GMAlpha/1.3.0 (iPhone; iOS 12.1.2; Scale/2.00)',
// 'Accept-Language': 'en-CN;q=1, zh-Hans-CN;q=0.9',
// 'Accept-Encoding': 'gzip, deflate',
// 'Connection': 'keep-alive'
// };
// }
// Map<String, dynamic> get params {
// return {
// 'platform': 'iPhone',
// 'os_version':'12.1.2',
// 'version':'1.3.0',
// 'model':'iPhone%206s',
// 'release':'0',
// 'idfa':'119A3567-6C81-40EA-A3ED-A63F7DCAD86B',
// 'idfv':'78BE2D94-7252-4C18-A816-2CEE6350B076',
// 'device_id':'119A3567-6C81-40EA-A3ED-A63F7DCAD86B',
// 'channel':'App%20Store',
// 'app_name':'gengmeiios',
// 'current_city_id':'worldwide',
// 'lat':'0',
// 'lng':'0',
// 'is_WiFi':'(null)',
// 'phone_id':'iPhone8'
// };
// }
// }
// // 管理任务
// class ALNetworkTask {
// ALNetworkTask({this.serviceInstance,this.networkContext, this.response});
// final Dio serviceInstance;
// final ALNetwork networkContext;
// Response response;
// void cancle(String api) {
// // CancelToken
// }
// }
// typedef NetworkSuccessCallback = void Function(NetworkSuccess success);
// typedef NetWorkErrorCallback = void Function(NetworkError error);
// typedef ProgressCallback = void Function(int count, int total);
// class ALNetwork {
// /**
// * 任务映射表
// * 外部可以通过 ALNetwork.taskMap 获取
// */
// static Map<String, ALNetworkTask> taskMap = {};
// const ALNetwork(
// {this.success,
// this.error,
// this.progress,
// this.api,
// this.params,
// this.formData}) : assert(api != null);
// final NetworkSuccessCallback success;
// final NetWorkErrorCallback error;
// final ProgressCallback progress;
// final String api;
// final Map params;
// final FormData formData;
// ALURL get url => ALURL(api: this.api);
// ///post
// Future<void> post() async{
// ALNetworkTask task = _initNetworkEngin();
// task.response = await task.serviceInstance.post(this.url.originUrl, data: this.params);
// _handleNetworkService(task.response);
// }
// /**
// * FormData formData = new FormData.from({
// "name": "simon",
// "age": 25,
// });
// */
// Future<void> postFormData() async{
// ALNetworkTask task = _initNetworkEngin();
// task.response = await task.serviceInstance.post(this.url.originUrl, data: this.formData);
// _handleNetworkService(task.response);
// }
///get
Future<void> excuteGet() async{
ALNetworkTask task = _initNetworkEngin();
task.response = await task.serviceInstance.get(this.url.originUrl, queryParameters: ALNetworkHeader().params);
_handleNetworkService(task.response);
}
// ///get
// Future<void> excuteGet() async{
// ALNetworkTask task = _initNetworkEngin();
// task.response = await task.serviceInstance.get(this.url.originUrl, queryParameters: ALNetworkHeader().params);
// _handleNetworkService(task.response);
// }
/**
* FormData formData = new FormData.from({
"name": "wendux",
"age": 25,
"file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt"),
// upload with bytes (List<int>)
"file2": new UploadFileInfo.fromBytes(
utf8.encode("hello world"), "word.txt"),
// Pass multiple files within an Array
"files": [
new UploadFileInfo(new File("./example/upload.txt"), "upload.txt"),
new UploadFileInfo(new File("./example/upload.txt"), "upload.txt")
]
});
*/
Future<void> upload() async{
ALNetworkTask task = _initNetworkEngin();
task.response = await task.serviceInstance.post(this.url.originUrl, data: this.formData,onSendProgress: this.progress);
_handleNetworkService(task.response);
}
///download
Future<void> download(String filePath) async{
ALNetworkTask task = _initNetworkEngin();
task.response = await task.serviceInstance.download(this.url.originUrl, filePath, onReceiveProgress: this.progress);
_handleNetworkService(task.response);
}
ALNetworkTask _initNetworkEngin(){
Response response;
Dio dio = new Dio();
dio.options = ALNetworkHeader().options;
ALNetworkTask task = ALNetworkTask(
serviceInstance:dio,
response: response,
networkContext: this
);
//handle task
taskMap[this.api] = task;
return task;
}
void _handleNetworkService(Response response) {
var data = jsonDecode(response.toString());
if(data.runtimeType ==Map && response.statusCode == 200){
if (data['error'] == 0){
this.success(NetworkSuccess(data: data));
}else{
this.error(NetworkError(error: data));
}
}else{
this.error(NetworkError(error: data));
}
//remove task
taskMap.remove(this.api);
}
}
\ No newline at end of file
// /**
// * FormData formData = new FormData.from({
// "name": "wendux",
// "age": 25,
// "file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt"),
// // upload with bytes (List<int>)
// "file2": new UploadFileInfo.fromBytes(
// utf8.encode("hello world"), "word.txt"),
// // Pass multiple files within an Array
// "files": [
// new UploadFileInfo(new File("./example/upload.txt"), "upload.txt"),
// new UploadFileInfo(new File("./example/upload.txt"), "upload.txt")
// ]
// });
// */
// Future<void> upload() async{
// ALNetworkTask task = _initNetworkEngin();
// task.response = await task.serviceInstance.post(this.url.originUrl, data: this.formData,onSendProgress: this.progress);
// _handleNetworkService(task.response);
// }
// ///download
// Future<void> download(String filePath) async{
// ALNetworkTask task = _initNetworkEngin();
// task.response = await task.serviceInstance.download(this.url.originUrl, filePath, onReceiveProgress: this.progress);
// _handleNetworkService(task.response);
// }
// ALNetworkTask _initNetworkEngin(){
// Response response;
// Dio dio = new Dio();
// dio.options = ALNetworkHeader().options;
// ALNetworkTask task = ALNetworkTask(
// serviceInstance:dio,
// response: response,
// networkContext: this
// );
// //handle task
// taskMap[this.api] = task;
// return task;
// }
// void _handleNetworkService(Response response) {
// var data = jsonDecode(response.toString());
// if(data.runtimeType ==Map && response.statusCode == 200){
// if (data['error'] == 0){
// this.success(NetworkSuccess(data: data));
// }else{
// this.error(NetworkError(error: data));
// }
// }else{
// this.error(NetworkError(error: data));
// }
// //remove task
// taskMap.remove(this.api);
// }
// }
\ No newline at end of file
......@@ -3,6 +3,59 @@ import 'dart:io';
import 'package:dio/dio.dart';
/**
* @Author: thl
* @GitHub: https://github.com/Sky24n
* @JianShu: https://www.jianshu.com/u/cbf2ad25d33a
* @Email: 863764940@qq.com
* @Description: Dio Util.
* @Date: 2018/12/19
*/
/// <BaseResp<T> 返回 status code msg data.
class BaseResp<T> {
String status;
int code;
String msg;
T data;
BaseResp(this.status, this.code, this.msg, this.data);
@override
String toString() {
StringBuffer sb = new StringBuffer('{');
sb.write("\"status\":\"$status\"");
sb.write(",\"code\":$code");
sb.write(",\"msg\":\"$msg\"");
sb.write(",\"data\":\"$data\"");
sb.write('}');
return sb.toString();
}
}
/// <BaseRespR<T> 返回 status code msg data Response.
class BaseRespR<T> {
String status;
int code;
String msg;
T data;
Response response;
BaseRespR(this.status, this.code, this.msg, this.data, this.response);
@override
String toString() {
StringBuffer sb = new StringBuffer('{');
sb.write("\"status\":\"$status\"");
sb.write(",\"code\":$code");
sb.write(",\"msg\":\"$msg\"");
sb.write(",\"data\":\"$data\"");
sb.write('}');
return sb.toString();
}
}
/// 请求方法.
class Method {
static final String get = "GET";
static final String post = "POST";
......@@ -12,88 +65,357 @@ class Method {
static final String patch = "PATCH";
}
///Http配置.
class HttpConfig {
/// constructor.
HttpConfig({
this.status,
this.code,
this.msg,
this.data,
this.options,
this.pem,
this.pKCSPath,
this.pKCSPwd,
});
/// BaseResp [String status]字段 key, 默认:status.
String status;
/// BaseResp [int code]字段 key, 默认:errorCode.
String code;
/// BaseResp [String msg]字段 key, 默认:errorMsg.
String msg;
/// BaseResp [T data]字段 key, 默认:data.
String data;
/// Options.
BaseOptions options;
/// 详细使用请查看dio官网 https://github.com/flutterchina/dio/blob/flutter/README-ZH.md#Https证书校验.
/// PEM证书内容.
String pem;
/// 详细使用请查看dio官网 https://github.com/flutterchina/dio/blob/flutter/README-ZH.md#Https证书校验.
/// PKCS12 证书路径.
String pKCSPath;
/// 详细使用请查看dio官网 https://github.com/flutterchina/dio/blob/flutter/README-ZH.md#Https证书校验.
/// PKCS12 证书密码.
String pKCSPwd;
}
/// 单例 DioUtil.
/// debug模式下可以打印请求日志. DioUtil.openDebug().
/// dio详细使用请查看dio官网(https://github.com/flutterchina/dio).
class DioUtil {
static final DioUtil _instance = DioUtil._init();
static Dio _dio;
/// BaseResp [String status]字段 key, 默认:status.
String _statusKey = "status";
/// BaseResp [int code]字段 key, 默认:errorCode.
String _codeKey = "errorCode";
/// BaseResp [String msg]字段 key, 默认:errorMsg.
String _msgKey = "errorMsg";
/// BaseResp [T data]字段 key, 默认:data.
String _dataKey = "data";
/// Options.
static BaseOptions _options = getDefOptions();
/// PEM证书内容.
String _pem;
/// PKCS12 证书路径.
String _pKCSPath;
/// PKCS12 证书密码.
String _pKCSPwd;
/// 是否是debug模式.
static bool _isDebug = false;
static DioUtil getInstance() {
return _instance;
}
factory DioUtil() {
return _instance;
}
DioUtil._init() {
_dio = new Dio();
_dio = new Dio(_options);
}
static BaseOptions getDefOptions() {
BaseOptions options = BaseOptions();
options.connectTimeout = 10 * 1000;
options.receiveTimeout = 20 * 1000;
options.contentType = ContentType.parse('application/x-www-form-urlencoded');
/// 打开debug模式.
static void openDebug() {
_isDebug = true;
}
Map<String, dynamic> headers = Map<String, dynamic>();
headers['Accept'] = 'application/json';
/// set Config.
void setConfig(HttpConfig config) {
_statusKey = config.status ?? _statusKey;
_codeKey = config.code ?? _codeKey;
_msgKey = config.msg ?? _msgKey;
_dataKey = config.data ?? _dataKey;
_mergeOption(config.options);
_pem = config.pem ?? _pem;
if (_dio != null) {
_dio.options = _options;
if (_pem != null) {
// httpClientAdapter
(_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
client.badCertificateCallback =
(X509Certificate cert, String host, int port) {
if (cert.pem == _pem) {
// 证书一致,则放行
return true;
}
return false;
};
};
String platform;
if(Platform.isAndroid) {
platform = "Android";
} else if(Platform.isIOS) {
platform = "IOS";
}
if (_pKCSPath != null) {
(_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
SecurityContext sc = new SecurityContext();
//file为证书路径
sc.setTrustedCertificates(_pKCSPath, password: _pKCSPwd);
HttpClient httpClient = new HttpClient(context: sc);
return httpClient;
};
}
}
headers['OS'] = platform;
options.headers = headers;
}
return options;
/// Make http request with options.
/// [method] The request method.
/// [path] The url path.
/// [data] The request data
/// [options] The request options.
/// <BaseResp<T> 返回 status code msg data .
Future<BaseResp<T>> request<T>(String method, String path,
{data, Options options, CancelToken cancelToken}) async {
Response response = await _dio.request(path,
data: data,
options: _checkOptions(method, options),
cancelToken: cancelToken);
_printHttpLog(response);
String _status;
int _code;
String _msg;
T _data;
if (response.statusCode == HttpStatus.ok ||
response.statusCode == HttpStatus.created) {
try {
if (response.data is Map) {
_status = (response.data[_statusKey] is int)
? response.data[_statusKey].toString()
: response.data[_statusKey];
_code = (response.data[_codeKey] is String)
? int.tryParse(response.data[_codeKey])
: response.data[_codeKey];
_msg = response.data[_msgKey];
_data = response.data[_dataKey];
} else {
Map<String, dynamic> _dataMap = _decodeData(response);
_status = (_dataMap[_statusKey] is int)
? _dataMap[_statusKey].toString()
: _dataMap[_statusKey];
_code = (_dataMap[_codeKey] is String)
? int.tryParse(_dataMap[_codeKey])
: _dataMap[_codeKey];
_msg = _dataMap[_msgKey];
_data = _dataMap[_dataKey];
}
return new BaseResp(_status, _code, _msg, _data);
} catch (e) {
return new Future.error(new DioError(
response: response,
message: "data parsing exception...",
type: DioErrorType.RESPONSE,
));
}
}
return new Future.error(new DioError(
response: response,
message: "statusCode: $response.statusCode, service error",
type: DioErrorType.RESPONSE,
));
}
setOptions(BaseOptions options) {
_options = options;
_dio.options = _options;
/// Make http request with options.
/// [method] The request method.
/// [path] The url path.
/// [data] The request data
/// [options] The request options.
/// <BaseRespR<T> 返回 status code msg data Response.
Future<BaseRespR<T>> requestR<T>(String method, String path,
{data, Options options, CancelToken cancelToken}) async {
Response response = await _dio.request(path,
data: data,
options: _checkOptions(method, options),
cancelToken: cancelToken);
_printHttpLog(response);
String _status;
int _code;
String _msg;
T _data;
if (response.statusCode == HttpStatus.ok ||
response.statusCode == HttpStatus.created) {
try {
if (response.data is Map) {
_status = (response.data[_statusKey] is int)
? response.data[_statusKey].toString()
: response.data[_statusKey];
_code = (response.data[_codeKey] is String)
? int.tryParse(response.data[_codeKey])
: response.data[_codeKey];
_msg = response.data[_msgKey];
_data = response.data[_dataKey];
} else {
Map<String, dynamic> _dataMap = _decodeData(response);
_status = (_dataMap[_statusKey] is int)
? _dataMap[_statusKey].toString()
: _dataMap[_statusKey];
_code = (_dataMap[_codeKey] is String)
? int.tryParse(_dataMap[_codeKey])
: _dataMap[_codeKey];
_msg = _dataMap[_msgKey];
_data = _dataMap[_dataKey];
}
return new BaseRespR(_status, _code, _msg, _data, response);
} catch (e) {
return new Future.error(new DioError(
response: response,
message: "data parsing exception...",
type: DioErrorType.RESPONSE,
));
}
}
return new Future.error(new DioError(
response: response,
message: "statusCode: $response.statusCode, service error",
type: DioErrorType.RESPONSE,
));
}
Future<Map<String, dynamic>> get(String path, {pathParams, data, Function errorCallback}) {
return request(path, method: Method.get, pathParams: pathParams, data: data, errorCallback: errorCallback);
/// Download the file and save it in local. The default http method is "GET",you can custom it by [Options.method].
/// [urlPath]: The file url.
/// [savePath]: The path to save the downloading file later.
/// [onProgress]: The callback to listen downloading progress.please refer to [OnDownloadProgress].
Future<Response> download(
String urlPath,
savePath, {
CancelToken cancelToken,
data,
Options options,
}) {
return _dio.download(urlPath, savePath,
cancelToken: cancelToken,
data: data,
options: options);
}
Future<Map<String, dynamic>> post(String path, {pathParams, data, Function errorCallback}) {
return request(path, method: Method.post, pathParams: pathParams, data: data, errorCallback: errorCallback);
/// decode response data.
Map<String, dynamic> _decodeData(Response response) {
if (response == null ||
response.data == null ||
response.data.toString().isEmpty) {
return new Map();
}
return json.decode(response.data.toString());
}
Future<Map<String, dynamic>> request(String path,{String method, Map pathParams, data, Function errorCallback}) async {
///restful请求处理
if(pathParams != null) {
pathParams.forEach((key, value) {
if(path.indexOf(key) != -1) {
path = path.replaceAll(":$key", value.toString());
}
});
/// check Options.
Options _checkOptions(method, options) {
print('_checkOptionsAAAA');
print(options);
if (options == null) {
options = new Options();
}
options.method = method;
return options;
}
/// merge Option.
void _mergeOption(BaseOptions opt) {
_options.method = opt.method ?? _options.method;
_options.headers = (new Map.from(_options.headers))..addAll(opt.headers);
_options.baseUrl = opt.baseUrl ?? _options.baseUrl;
_options.connectTimeout = opt.connectTimeout ?? _options.connectTimeout;
_options.receiveTimeout = opt.receiveTimeout ?? _options.receiveTimeout;
_options.responseType = opt.responseType ?? _options.responseType;
_options.extra = (new Map.from(_options.extra))..addAll(opt.extra);
_options.contentType = opt.contentType ?? _options.contentType;
_options.validateStatus = opt.validateStatus ?? _options.validateStatus;
_options.followRedirects = opt.followRedirects ?? _options.followRedirects;
}
Response response = await _dio.request(path, data: data, options: Options(method: method));
/// print Http Log.
void _printHttpLog(Response response) {
if (!_isDebug) {
return;
}
try {
print("----------------Http Log----------------" +
"\n[statusCode]: " +
response.statusCode.toString() +
"\n[request ]: " +
_getOptionsStr(response.request));
_printDataStr("reqdata ", response.request.data);
_printDataStr("response", response.data);
} catch (ex) {
print("Http Log" + " error......");
}
}
if(response.statusCode == HttpStatus.ok || response.statusCode == HttpStatus.created) {
try {
if(response.data is Map) {
return response.data;
} else {
return json.decode(response.data.toString());
}
} catch(e) {
/// get Options Str.
String _getOptionsStr(Options request) {
return "method: " +
request.method;
}
return null;
/// print Data Str.
void _printDataStr(String tag, Object value) {
String da = value.toString();
while (da.isNotEmpty) {
if (da.length > 512) {
print("[$tag ]: " + da.substring(0, 512));
da = da.substring(512, da.length);
} else {
print("[$tag ]: " + da);
da = "";
}
} else {
_handleHttpError(response.statusCode);
if(errorCallback != null) {
errorCallback(response.statusCode);
}
return null;
}
}
///处理Http错误码
void _handleHttpError(int errorCode) {
/// get dio.
Dio getDio() {
return _dio;
}
/// create new dio.
static Dio createNewDio([Options options]) {
Dio dio = new Dio();
return dio;
}
}
\ No newline at end of file
/// get Def Options.
static BaseOptions getDefOptions() {
BaseOptions options = BaseOptions();
options.connectTimeout = 10 * 1000;
options.receiveTimeout = 20 * 1000;
options.contentType = ContentType.parse('application/x-www-form-urlencoded');
options.baseUrl = 'https://earth.iyanzhi.com';
Map<String, dynamic> headers = Map<String, dynamic>();
headers['Accept'] = 'application/json';
return options;
}
}
......@@ -7,7 +7,7 @@ packages:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
version: "2.2.0"
boolean_selector:
dependency: transitive
description:
......@@ -94,7 +94,7 @@ packages:
name: quiver
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.2"
version: "2.0.3"
sky_engine:
dependency: transitive
description: flutter
......@@ -141,7 +141,7 @@ packages:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.4"
version: "0.2.5"
typed_data:
dependency: transitive
description:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment