import 'package:dio/dio.dart'; ///日志拦截器 class DioLogInterceptor extends Interceptor { ///请求前 @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { String requestStr = "\n 请求 - URL:${/*options.baseUrl + */ options.uri}" + " 时间 - :${DateTime.now().millisecondsSinceEpoch}\n"; //requestStr += "- HEADER:\n${options.headers.mapToStructureString()}\n"; final data = options.data; if (data != null) { if (data is Map) requestStr += "- BODY:\n${data.mapToStructureString()}\n"; else if (data is FormData) { final formDataMap = Map() ..addEntries(data.fields) ..addEntries(data.files); requestStr += "- BODY:\n${formDataMap.mapToStructureString()}\n"; } else requestStr += "- BODY:\n${data.toString()}\n"; } print(requestStr); handler.next(options); } ///出错前 @override void onError(DioError err, ErrorInterceptorHandler handler) { String errorStr = "\n==================== 响应 ====================\n" "- URL:\n${err.requestOptions.path}\n" "- METHOD: ${err.requestOptions.method}\n"; /* errorStr += "- HEADER:\n${err.response.headers.map.mapToStructureString()}\n";*/ if (err.response != null && err.response!.data != null) { print('╔ ${err.type.toString()}'); errorStr += "- ERROR:\n${_parseResponse(err.response!)}\n"; } else { errorStr += "- ERRORTYPE: ${err.type}\n"; errorStr += "- MSG: ${err.message}\n"; } print(errorStr); handler.next(err); } ///响应前 @override void onResponse(Response response, ResponseInterceptorHandler handler) { String responseStr = "\n 响应 - URL:${response.requestOptions.uri}" + " 时间 - :${DateTime.now().millisecondsSinceEpoch}\n"; /* responseStr += "- HEADER:\n{"; response.headers.forEach( (key, list) => responseStr += "\n " + "\"$key\" : \"$list\","); responseStr += "\n}\n";*/ //responseStr += "- STATUS: ${response.statusCode}\n"; if (response.data != null) { responseStr += "- BODY:\n ${_parseResponse(response)}"; } printWrapped(responseStr); handler.next(response); } void printWrapped(String text) { final pattern = new RegExp('.{1,800}'); // 800 is the size of each chunk pattern.allMatches(text).forEach((match) => print(match.group(0))); } String _parseResponse(Response response) { String responseStr = ""; var data = response.data; if (data is Map) responseStr += data.mapToStructureString(); else if (data is List) responseStr += data.listToStructureString(); else responseStr += response.data.toString(); return responseStr; } } ///Map拓展,MAp转字符串输出 extension Map2StringEx on Map { String mapToStructureString({int indentation = 2}) { String result = ""; String indentationStr = " " * indentation; if (true) { result += " {"; this.forEach((key, value) { if (value is Map) { var temp = value.mapToStructureString(indentation: indentation + 2); result += "$indentationStr" + "\"$key\":$temp,"; } else if (value is List) { result += "$indentationStr" + "\"$key\":${value.listToStructureString(indentation: indentation + 2)},"; } else { result += "$indentationStr" + "\"$key\":\"$value\","; } }); result = result.substring(0, result.length - 1); result += indentation == 2 ? "}" : "\n${" " * (indentation - 1)}}"; } return result; } } ///List拓展,List转字符串输出 extension List2StringEx on List { String listToStructureString({int indentation = 2}) { String result = ""; String indentationStr = " " * indentation; if (true) { result += "$indentationStr["; this.forEach((value) { if (value is Map) { var temp = value.mapToStructureString(indentation: indentation + 2); result += "\n$indentationStr" + "\"$temp\","; } else if (value is List) { result += value.listToStructureString(indentation: indentation + 2); } else { result += "\n$indentationStr" + "\"$value\","; } }); result = result.substring(0, result.length - 1); result += "\n$indentationStr]"; } return result; } }