flutter dio 出现500错误却无法显示出错误内容

49 阅读1分钟

在dio_mixin.dart的文件中会判断状态码当不是200就直接抛出错误 不解析数据,因此可以先解析数据,查找问题

//此方法是处理数据的方法
Future<Response<dynamic>> _dispatchRequest<T>(RequestOptions reqOpt) async {
  final cancelToken = reqOpt.cancelToken;
  try {
    final stream = await _transformData(reqOpt);
    final operation = CancelableOperation.fromFuture(
      httpClientAdapter.fetch(
        reqOpt,
        stream,
        cancelToken?.whenCancel,
      ),
    );
    final operationWeakReference = WeakReference(operation);
    cancelToken?.whenCancel.whenComplete(() {
      operationWeakReference.target?.cancel();
    });
    final responseBody = await operation.value;
 
    final headers = Headers.fromMap(
      responseBody.headers,
      preserveHeaderCase: reqOpt.preserveHeaderCase,
    );
    // Make sure headers and [ResponseBody.headers] are the same instance.
    responseBody.headers = headers.map;
    final ret = Response<dynamic>(
      headers: headers,
      requestOptions: reqOpt,
      redirects: responseBody.redirects ?? [],
      isRedirect: responseBody.isRedirect,
      statusCode: responseBody.statusCode,
      statusMessage: responseBody.statusMessage,
      extra: responseBody.extra,
    );

       //可以在这里打印 数据
    // Object? data = await transformer.transformResponse(
    //   reqOpt,
    //   responseBody,
    // );
    // print(data);
    //原来的逻辑是判断status 如果不是200就不会去解析数据
    final statusOk = reqOpt.validateStatus(responseBody.statusCode);
    if (statusOk || reqOpt.receiveDataWhenStatusError == true) {
      responseBody.stream = handleResponseStream(reqOpt, responseBody);

      Object? data = await transformer.transformResponse(
        reqOpt,
        responseBody,
      );
      // Make the response as null before returned as JSON.
      if (data is String &&
          data.isEmpty &&
          T != dynamic &&
          T != String &&
          reqOpt.responseType == ResponseType.json) {
        data = null;
      }
      ret.data = data;
    } else {
      responseBody.close();
    }
    checkCancelled(cancelToken);
    if (statusOk) {
      return ret;
    } else {
      throw DioException.badResponse(
        statusCode: responseBody.statusCode,
        requestOptions: reqOpt,
        response: ret,
      );
    }
  } catch (e) {
    throw assureDioException(e, reqOpt);
  }
}