提交 ac409f02 authored 作者: 张国庆's avatar 张国庆

修改dio的json解析方式

上级 9e8f0aa8
......@@ -14,12 +14,13 @@ export 'proxy.dart';
abstract class BaseDio {
final dio = Dio(
BaseOptions(
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
contentType: Headers.jsonContentType,
// Transform the response data to a String encoded with UTF8.
// The default value is [ResponseType.JSON].
),
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
contentType: Headers.jsonContentType,
responseType: ResponseType.plain
// Transform the response data to a String encoded with UTF8.
// The default value is [ResponseType.JSON].
),
);
//初始化配置dio实例
......@@ -27,13 +28,14 @@ abstract class BaseDio {
dio.options.baseUrl = setBaseUrl();
dio.options.headers = setHeaders();
// 配置JSON转换器
dio.transformer = MyTransformer();
dio.interceptors.add(getHeadersInterceptor());
dio.interceptors.add(getLogInterceptor());
//配置代理
setProxyUri(dio, isProdEnv());
}
final jsonTransformer = MyTransformer();
String setBaseUrl();
// 设置请求头拦截器
......@@ -57,11 +59,9 @@ abstract class BaseDio {
void onLoginExpire() => _onLoginExpire();
Future<void> onNetSuccess(
Response response,
NetSuccessCallback successCallback,
NetErrorCallback? errorCallback) async =>
await _onNetSuccess(response, successCallback, errorCallback);
void onNetSuccess(Response response, NetSuccessCallback successCallback,
NetErrorCallback? errorCallback) =>
_onNetSuccess(response, successCallback, errorCallback);
// 登录过期的处理
void _onLoginExpire() {
......@@ -87,7 +87,7 @@ abstract class BaseDio {
}
// 构建网络请求
Future<void> request({
void request({
required String requestUrl,
required Method method,
Options? options,
......@@ -103,7 +103,7 @@ abstract class BaseDio {
data: data,
options: _checkOptions(method.value, options),
);
await onNetSuccess(response, successCallback, errorCallback);
onNetSuccess(response, successCallback, errorCallback);
} on DioException catch (e) {
if (e.response != null) {
logger.e(
......@@ -131,12 +131,23 @@ abstract class BaseDio {
data: data,
options: _checkOptions(method.value, options),
);
var responseCode = response.data?['code']?.toString();
if (responseCode == "100" || responseCode == "-100") {
logger.e("登录过期:${response.data?['msg']}");
onLoginExpire();
try {
final String data = response.data.toString();
final bool isCompute = data.length > 10 * 1024;
loggerNoStack.i('isCompute:$isCompute');
final Map<String, dynamic> map = isCompute
? await jsonTransformer.parseJson(data)
: jsonTransformer.parseAndDecode(data);
var responseCode = map['code']?.toString();
if (responseCode == "100" || responseCode == "-100") {
logger.e("登录过期:${map['msg']}");
onLoginExpire();
}
return response.data;
} catch (e) {
logger.e("数据解析错误:${e.toString()}");
return {"code": 400, "message": "数据解析错误"};
}
return response.data;
} on DioException catch (e) {
if (e.response != null) {
logger.e(
......@@ -150,22 +161,31 @@ abstract class BaseDio {
}
// 处理网络请求成功逻辑
Future<void> _onNetSuccess(
Response response,
NetSuccessCallback successCallback,
void _onNetSuccess(Response response, NetSuccessCallback successCallback,
NetErrorCallback? errorCallback) async {
var responseCode = response.data?['code']?.toString();
if (responseCode == "100" || responseCode == "-100") {
logger.e("登录过期:${response.data?['msg']}");
onLoginExpire();
return;
}
try {
final String data = response.data.toString();
final bool isCompute = data.length > 10 * 1024;
loggerNoStack.i('isCompute:$isCompute');
final Map<String, dynamic> map = isCompute
? await jsonTransformer.parseJson(data)
: jsonTransformer.parseAndDecode(data);
var responseCode = map['code']?.toString();
if (responseCode == "100" || responseCode == "-100") {
logger.e("登录过期:${map['msg']}");
onLoginExpire();
return;
}
if (response.data?['code'] == 0) {
await successCallback.call(response.data?['data']);
} else {
logger.e("请求错误:${response.data?['code']} ${response.data?['msg']}");
await errorCallback?.call(response.data?['code'], response.data?['msg']);
if (map['code'] == 0) {
await successCallback.call(map['data']);
} else {
logger.e("请求错误:${map['code']} ${map['msg']}");
await errorCallback?.call(map['code'], map['msg']);
}
} catch (e) {
logger.e("数据解析错误:${e.toString()}");
await errorCallback?.call(400, "数据解析错误");
}
}
}
......
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
/// If the request data is a `List` type, the [BackgroundTransformer] will send data
/// by calling its `toString()` method. However, normally the List object is
/// not expected for request data( mostly need Map ). So we provide a custom
/// [Transformer] that will throw error when request data is a `List` type.
class MyTransformer {
class MyTransformer extends BackgroundTransformer {
@override
JsonDecodeCallback get jsonDecodeCallback => parseJson;
Map<String, dynamic> _parseAndDecode(String response) {
Map<String, dynamic> parseAndDecode(String response) {
return jsonDecode(response) as Map<String, dynamic>;
}
Future<Map<String, dynamic>> parseJson(String text) {
return compute(_parseAndDecode, text);
return compute(parseAndDecode, text);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论