import 'dart:io';import 'package:dio/dio.dart';import 'package:private_tutor/common/SpUtils.dart';import 'package:connectivity/connectivity.dart';import 'dart:collection';import 'package:private_tutor/common/config/Config.dart';import 'package:private_tutor/net/ResultCode.dart';import 'package:private_tutor/net/ResultData.dart';///http请求管理类,可单独抽取出来
classHttpRequest {staticString _baseUrl;static const CONTENT_TYPE_JSON = "application/json";static const CONTENT_TYPE_FORM = "application/x-www-form-urlencoded";static Map optionParams ={"timeoutMs": 15000,"token": null,"authorizationCode": null,
};staticsetBaseUrl(String baseUrl){
_baseUrl=baseUrl;
}staticget(url,param) async{return await request(_baseUrl+url, param, null, new Options(method:"GET"));
}staticpost(url,param) async{return await request(_baseUrl+url, param, {"Accept": 'application/vnd.github.VERSION.full+json'}, new Options(method: 'POST'));
}staticdelete(url,param) async{return await request(_baseUrl+url, param, null, new Options(method: 'DELETE'));
}staticput(url,param) async{return await request(_baseUrl+url, param, null, new Options(method: "PUT", contentType: ContentType.text));
}///发起网络请求
///[ url] 请求url
///[ params] 请求参数
///[ header] 外加头
///[ option] 配置
static request(url, params, Map header, Options option, {noTip = false}) async {//没有网络
var connectivityResult = await (newConnectivity().checkConnectivity());if (connectivityResult ==ConnectivityResult.none) {return new ResultData(Code.errorHandleFunction(Code.NETWORK_ERROR, "", noTip), false, Code.NETWORK_ERROR);
}
Map headers = newHashMap();if (header != null) {
headers.addAll(header);
}//授权码
if (optionParams["authorizationCode"] == null) {
var authorizationCode=await getAuthorization();if (authorizationCode != null) {
optionParams["authorizationCode"] =authorizationCode;
}
}
headers["Authorization"] = optionParams["authorizationCode"];//设置 baseUrl
if (option != null) {
option.headers=headers;
}else{
option= new Options(method: "get");
option.headers=headers;
}///超时
option.connectTimeout = 15000;
Dio dio= newDio();//添加拦截器
if(Config.DEBUG) {
dio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options){
print("\n================== 请求数据 ==========================");
print("url = ${options.uri.toString()}");
print("headers = ${options.headers}");
print("params = ${options.data}");
},
onResponse: (Response response){
print("\n================== 响应数据 ==========================");
print("code = ${response.statusCode}");
print("data = ${response.data}");
print("\n");
},
onError: (DioError e){
print("\n================== 错误响应数据 ======================");
print("type = ${e.type}");
print("message = ${e.message}");
print("stackTrace = ${e.stackTrace}");
print("\n");
}
));
}
Response response;try{
response=await dio.request(url, data: params, options: option);
} on DioErrorcatch(e) {//请求错误处理
Response errorResponse;if (e.response != null) {
errorResponse=e.response;
}else{
errorResponse= new Response(statusCode: 666);
}if (e.type ==DioErrorType.CONNECT_TIMEOUT) {
errorResponse.statusCode=Code.NETWORK_TIMEOUT;
}if(Config.DEBUG) {
print('请求异常: ' +e.toString());
print('请求异常 url: ' +url);
}return new ResultData(Code.errorHandleFunction(errorResponse.statusCode, e.message, noTip), false, errorResponse.statusCode);
}try{if (option.contentType != null && option.contentType.primaryType == "text") {return new ResultData(response.data, true, Code.SUCCESS);
}else{
var responseJson=response.data;if (response.statusCode == 201 && responseJson["token"] != null) {
optionParams["authorizationCode"] = 'token ' + responseJson["token"];
await SpUtils.save(Config.TOKEN_KEY, optionParams["authorizationCode"]);
}
}if (response.statusCode == 200 || response.statusCode == 201) {return ResultData(response.data, true, Code.SUCCESS, headers: response.headers);
}
}catch(e) {
print(e.toString()+url);return ResultData(response.data, false, response.statusCode, headers: response.headers);
}return new ResultData(Code.errorHandleFunction(response.statusCode, "", noTip), false, response.statusCode);
}///清除授权
staticclearAuthorization() {
optionParams["authorizationCode"] = null;
SpUtils.remove(Config.TOKEN_KEY);
}///获取授权token
staticgetAuthorization() async {
String token=await SpUtils.get(Config.TOKEN_KEY);if (token == null) {
String basic=await SpUtils.get(Config.USER_BASIC_CODE);if (basic == null) {//提示输入账号密码
} else{//通过 basic 去获取token,获取到设置,返回token
return "Basic $basic";
}
}else{
optionParams["authorizationCode"] =token;returntoken;
}
}
}