在开发调试时,我们常需要打印接口的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));