flutter小技巧 - 打印curl

666 阅读1分钟

在开发调试时,我们常需要打印接口的curl,下面以网络库dio如何实现打印curl为案列。

1.创建拦截器

/// 日志拦截器
class LoggerInterceptor extends InterceptorsWrapper {
  ///是否是release包
  bool isRelease = false;

  LoggerInterceptor(this.isRelease);

  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    if (isRelease) {
      super.onRequest(options, handler);
    } else {
      LogUtils.instance.v(
          "\n================================= CURL开始 =================================");
      LogUtils.instance.v(dio2curl(options));
      LogUtils.instance.v(
          "\n================================= CURL结束 =================================");

      if (options.data != null) {
        //不是表单数据输出数据
        if (options.data is! FormData) {
          LogUtils.instance.v(json.encode(options.data));
        }
      }
      handler.next(options);
    }
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    if (isRelease) {
      super.onResponse(response, handler);
    } else {
      LogUtils.instance.v(
          "\n================================= 响应数据开始 =================================");
      LogUtils.instance.v("uri = ${response.realUri}");
      LogUtils.instance.v("code = ${response.statusCode}");
      if (response.data != null && response.data is Map) {
        LogUtils.instance.v("data = ${json.encode(response.data)}");
      }
      LogUtils.instance.v(
          "================================= 响应数据结束 =================================\n");
      handler.next(response);
    }
  }

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    if (isRelease) {
      super.onError(err, handler);
    } else {
      LogUtils.instance.v(
          "\n=================================错误响应数据 =================================");
      LogUtils.instance.v("type = ${err.type}");
      LogUtils.instance.v("message = ${err.message}");
      LogUtils.instance.v("stackTrace = ${err.stackTrace}");
      LogUtils.instance.v("\n");
      handler.next(err);
    }
  }
}

// A simple utility function to dump `curl` from "Dio" requests
String dio2curl(RequestOptions requestOption) {
  var curl = '';

  // Add PATH + REQUEST_METHOD
  curl += 'curl --request ${requestOption.method} '${requestOption.uri}'';

  // Include headers
  for (var key in requestOption.headers.keys) {
    curl += ' -H '$key: ${requestOption.headers[key]}'';
  }

  // Include data if there is data
  if (requestOption.data != null) {
    if (requestOption.data is Map || requestOption.data is List) {
      curl += ' -d '${jsonEncode(requestOption.data)}'';
    } else {
      curl += ' -d '${requestOption.data}'';
    }
  }

  curl += ' --insecure'; //bypass https verification

  return curl;
}

2.添加新建的拦截器

_dio?.interceptors.add(LoggerInterceptor(kReleaseMode));