在 Flutter 应用程序中使用 Dio 库从 API 获取数据时,我遇到间歇性 FormatException,并显示消息“意外的输入结束”。此异常并非始终发生;有时我得到正确的数据,有时会出现此错误。
DioException (DioException [unknown]: null
Error: FormatException: Unexpected end of input (at character 3247)
...2024-05-06T15:00:41.000000Z","updated_at":"2024-05-07T08:51:56.000000Z"}}}]
这是我的存储库
Future<ApiResult<AppointmentsResponse>> getAppointments() async {
final dio = Dio();
dio.interceptors.add(LogInterceptor(responseBody: true));
dio.interceptors.add(LogInterceptor(requestBody: true));
try {
final prefs = await SharedPreferences.getInstance();
final String? stored_token = await prefs.getString('token');
final int? tech_id = await prefs.getInt('tech_id');
final dio = DioFactory.getDio();
final response = await dio.get(
'$baseurl/api/appointments/tech/$tech_id/all',
options: Options(
headers: {'Authorization': 'Bearer $stored_token'},
));
debugPrint("Raw API Response: $response");
debugPrint('Response: ${response.statusCode}');
debugPrint("response11: ${response.data}");
// Process your response data here
Map<String, dynamic> responseData = response.data is Map<String, dynamic>
? response.data
: jsonDecode(response.data);
return ApiResult.success(AppointmentsResponse.fromJson(responseData));
} catch (e, stacktrace) {
logger.e("Error: $e, StackTrace: $stacktrace");
return ApiResult.failure(e.toString());
}
}
我的集团提供商中也有这个
BlocProvider<AppointmentCubit>(
create: (BuildContext context) => AppointmentCubit(AppointmentRepo(
apiService: ApiService(Dio(BaseOptions(
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
followRedirects: false,
// // will not throw errors
validateStatus: (status) => true,
))))),
),
所以在看到我们的之后我有一个建议你应该使用这个。
Future<ApiResult<AppointmentsResponse>> getAppointments() async {
final dio = Dio();
dio.interceptors.add(LogInterceptor(responseBody: true));
dio.interceptors.add(LogInterceptor(requestBody: true));
try {
final prefs = await SharedPreferences.getInstance();
final String? stored_token = await prefs.getString('token');
final int? tech_id = await prefs.getInt('tech_id');
final dio = DioFactory.getDio();
final response = await dio.get(
'$baseurl/api/appointments/tech/$tech_id/all',
options: Options(
headers: {'Authorization': 'Bearer $stored_token'},
));
debugPrint("Raw API Response: $response");
if (response.statusCode == 200) {
debugPrint('Response: ${response.statusCode}');
debugPrint("response11: ${response.data}");
//process your respone data here
Map <String, dynamic> responseData = responseData is Map<String, dynamic>
? response.data : jsoneDecode(response.data);
return ApiResult.success(AppointmentsResponse.fromJson(responseData));
} else{
// handle non-200 status code
return ApiResult.failure("failed to get appointments. Status code: ${response.statusCode}");
}
} catch (e, stacktrace) {
logger.e("Error: $e, StackTrace: $stacktrace");
return ApiResult.failure(e.toString());
}
我添加了一些内容希望这会有所帮助