1.config 配置要请求url的根地址,及环境
config.dart
import 'env.dart';
class Config {
//各种配置
String APP_ID;
String SECURITY_KEY;
String API_DOMAIN;
// 内网环境
static final String _NEIBU_APP_ID = "381";
static final String _NEIBU_SECURITY_KEY = "aaaaaaaaaaaaaaaaaaaaaaaaa";
static final String _NEIBU_API_DOMAIN = "https://neibu.koo.com";
// 外网环境
static final String _PRODUCT_APP_ID = "180";
static final String _PRODUCT_SECURITY_KEY = "aaaaaaaaaaaaaaaaaaaaaaaa";
static final String _PRODUCT_API_DOMAIN = "https://neibu.koo.com";
void setEnv(Env env){
switch (env) {
case Env.NEIBU:
APP_ID=_NEIBU_APP_ID;
SECURITY_KEY=_NEIBU_SECURITY_KEY;
API_DOMAIN=_NEIBU_API_DOMAIN;
break;
case Env.PRODUCT:
APP_ID=_PRODUCT_APP_ID;
SECURITY_KEY=_PRODUCT_SECURITY_KEY;
API_DOMAIN=_PRODUCT_API_DOMAIN;
break;
default:
APP_ID=_PRODUCT_APP_ID;
SECURITY_KEY=_PRODUCT_SECURITY_KEY;
API_DOMAIN=_PRODUCT_API_DOMAIN;
break;
}
}
// 单例对象
static final Config _instance=Config._internal();
// 内部构造方法,可避免外部暴露构造函数,进行实例化
Config._internal();
// 工厂构造方法,这里使用命名构造函数方式进行声明
factory Config.getInstance() => _instance;
}
2.环境枚举
env.dart
enum Env {
NEIBU,
PRODUCT
}
3.参数加密处理类
encrypt_params.dart
// import 'dart:convert';
// import 'dart:ffi'; // For FFI
// import 'dart:io'; // For Platform.isX
// import 'package:ffi/ffi.dart';
//
// import '../config.dart';
// final DynamicLibrary nativeLib = Platform.isAndroid
// ? DynamicLibrary.open("libsome.so")
// : DynamicLibrary.open("some.framework/some");
//
// typedef reverse_func = Pointer<Utf8> Function(Pointer<Utf8> str, Pointer<Utf8> str2);
// typedef Reverse = Pointer<Utf8> Function(Pointer<Utf8> str, Pointer<Utf8> str2);
//
// final reversePointer = nativeLib.lookup<NativeFunction<reverse_func>>('reverse');
// final reverse = reversePointer.asFunction<Reverse>();
//
// class FlutterNoCppSrc {
// static String _getNetParams(String params){
// Pointer<Utf8> paramsUtf8 = Utf8.toUtf8(params);
// Pointer<Utf8> security = Utf8.toUtf8(Config.security_KEY);
// Pointer<Utf8> result = reverse(paramsUtf8,security);
// print(result.toString());
// final reversedMessage = Utf8.fromUtf8(result);
// return reversedMessage;
// }
// static getRequestMap(Map<dynamic, dynamic> requestMaps){
// requestMaps['app_id'] = Config.appId;
// String params = _getNetParams(json.encode(requestMaps));
// requestMaps['sign'] = params;
// }
// }
import 'dart:ffi'; // For FFI
import 'dart:io'; // For Platform.isX
import 'package:ffi/ffi.dart';
import '../config.dart';
final DynamicLibrary nativeLib = Platform.isAndroid
? DynamicLibrary.open("libsome.so")
: DynamicLibrary.open("some.framework/some");
final int Function(int x, int y) nativeAdd = nativeLib
.lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add")
.asFunction();
typedef reverse_func = Pointer<Utf8> Function(Pointer<Utf8> str, Pointer<Utf8> str2);
typedef Reverse = Pointer<Utf8> Function(Pointer<Utf8> str, Pointer<Utf8> str2);
final reversePointer = nativeLib.lookup<NativeFunction<reverse_func>>('reverse');
final reverse = reversePointer.asFunction<Reverse>();
class FlutterNoCppSrc {
// static const MethodChannel _channel =
// const MethodChannel('flutter_no_cpp_src');
//
// static Future<String> get platformVersion async {
// final String version = await _channel.invokeMethod('getPlatformVersion');
// return version;
// }
static int addWithCpp(int x, int y) {
return nativeAdd(x, y);
}
static String getNetParams(String params){
// print("getNetParams Begin:"+params);
Pointer<Utf8> paramsUtf8 = Utf8.toUtf8(params);
Pointer<Utf8> security = Utf8.toUtf8(Config.getInstance().SECURITY_KEY);
Pointer<Utf8> result = reverse(paramsUtf8,security);
final reversedMessage = Utf8.fromUtf8(result);
// print("result:"+reversedMessage);
return reversedMessage;
}
}
4.一个简单的网络请求管理器
http_manager.dart
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/adapter.dart';
import 'package:kooielts/base/base_resp.dart';
import 'package:kooielts/base/utils.dart';
import '../config.dart';
import 'encrypt_params.dart';
class HttpManager {
Dio _dio;
BaseOptions _options;
Future post<T>(String path,Map params) async{
params["app_id"]=Config.getInstance().APP_ID;
print("path:$path");
print("params$params");
params["validation"]=FlutterNoCppSrc.getNetParams(json.encode(params));
var response =await _dio.post(path, data:params);
if (response.statusCode == HttpStatus.ok){
return response.data["obj"];
}
return new Future.error(new DioError(request: response.request,response: response,type: DioErrorType.RESPONSE,error: "请求失败"));
}
static BaseOptions _getDefOptions() {
return BaseOptions(
connectTimeout: 5000,
receiveTimeout: 100000,
headers: Utils.getHeader(),
baseUrl: Config.getInstance().API_DOMAIN,
contentType:ContentType.parse("application/x-www-form-urlencoded").toString(),
);
}
// 单例对象
static HttpManager _instance=HttpManager._internal();
// 内部构造方法,可避免外部暴露构造函数,进行实例化
HttpManager._internal(){
_options=_getDefOptions();
_dio=Dio(_options);
// 设置代理 便于本地 charles 抓包
(_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
(HttpClient client) {
client.findProxy = (uri) {
return "PROXY 10.155.33.250:8888";
};
client.badCertificateCallback =
(X509Certificate cert, String host, int port) {
return true;
};
};
}
// 工厂构造方法,这里使用命名构造函数方式进行声明
factory HttpManager.getInstance() => _instance;
}
5.网络请求调用
在initState()中
HttpManager.getInstance().post<Map<String,dynamic>>(Api.launchInfo, map).then((value){
// var config = jsonDecode(value);
// SpUtil.getInstance().then((value) => value.)
setState(() {
info = LaunchInfo.fromJson(value);
_adUrl=info.infos.first.imageurl;
});
});
其中info就是我们最终得到的数据