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

修改dio的json解析方式

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