由于公司APP開發網絡請求涉及到cookie的的運用,自己抽點時間研究了一下,flutter dio中cookie的設置
dio_cookie_manager
cookie_jar
1.獲取cookie,存儲(持久化處理),用到兩個庫,本身dio就是基于cookie_jar來管理cookie的
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:cookie_jar/cookie_jar.dart';
2.把cookie存儲到APP的內存當中,下次請求的時候就會使用到,這里用到了這個庫 path_provider,來獲取路徑,這里是在自己創建的dio基類HttpUtil中設置的
///設置cookie
static void _getLocalFile() async {
// 獲取文檔目錄的路徑
Directory appDocDir = await getApplicationDocumentsDirectory();
String dir = appDocDir.path + "/.cookies/";
print( 'cookie路徑地址:' + dir);
var cookieJar = PersistCookieJar(dir: dir);
_dio.interceptors.add(CookieManager(cookieJar));
}
HttpUtil代碼
class HttpUtil {
static final HttpUtil _singleton = HttpUtil._internal();
static HttpUtil get instance => HttpUtil();
factory HttpUtil() {
return _singleton;
}
static Dio _dio;
Dio getDio() {
return _dio;
}
HttpUtil._internal() {
var options = BaseOptions(
connectTimeout: 15000,
receiveTimeout: 15000,
responseType: ResponseType.plain,
contentType: "application/x-www-form-urlencoded",
baseUrl: "http://47.98.xxxxxx",
);
_dio = Dio(options);
print('??' * 20);
_getLocalFile();
print( 'cookie路徑地址');
/// Fiddler抓包代理配置 http://www.lxweimin.com/p/d831b1f7c45b
(_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
(HttpClient client) {
client.findProxy = (uri) {
//proxy all request to localhost:8888
return "PROXY 192.168.1.198:8888";
};
client.badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
};
}
///設置cookie
static void _getLocalFile() async {
// 獲取文檔目錄的路徑
Directory appDocDir = await getApplicationDocumentsDirectory();
String dir = appDocDir.path + "/.cookies/";
print( 'cookie路徑地址:' + dir);
var cookieJar = PersistCookieJar(dir: dir);
_dio.interceptors.add(CookieManager(cookieJar));
}
}
String requestParams(Map<String, Object> value) {
return "jsonStr=${json.encode(value)}";
}
String getErrorMessage(DioErrorType type) {
switch (type) {
case DioErrorType.DEFAULT:
return "網絡不可用,請檢查網絡";
case DioErrorType.CONNECT_TIMEOUT:
return "網絡連接超時,請重試";
case DioErrorType.SEND_TIMEOUT:
return "數據發送超時,請重試";
case DioErrorType.RECEIVE_TIMEOUT:
return "數據接受超時,請重試";
case DioErrorType.RESPONSE:
return "無法連接服務器,請重試";
case DioErrorType.CANCEL:
return "網絡連接已取消";
default:
return "";
}
}