MST

星途 面试题库

面试题:Flutter网络请求日志在复杂场景下的处理

假设你的Flutter应用需要处理多个不同的API服务,且每个服务有不同的认证方式(如OAuth、JWT等)。在这种复杂场景下,如何设计一个统一的网络请求日志记录机制,既能区分不同服务的日志,又能保证日志记录的安全性和准确性?阐述设计思路并给出部分关键代码。
28.5万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 创建日志管理器:设计一个单例的日志管理器,负责统一处理所有网络请求的日志记录。
  2. 区分服务:在日志记录中添加服务标识,以便区分不同的API服务。
  3. 认证方式处理:针对不同认证方式,在日志记录中明确记录认证信息,但需注意对敏感信息进行加密或隐藏处理,保证安全性。
  4. 日志准确性:记录请求和响应的完整信息,包括URL、请求头、请求体、响应状态码、响应体等。

关键代码

  1. 定义日志管理器单例
class NetworkLogManager {
  static final NetworkLogManager _instance = NetworkLogManager._internal();
  factory NetworkLogManager() => _instance;
  NetworkLogManager._internal();

  void logRequest(String serviceName, String url, Map<String, String> headers,
      dynamic body, String authType) {
    // 隐藏敏感信息,例如对JWT进行部分隐藏处理
    String maskedAuth = _maskAuthInfo(authType, headers);
    String logMessage =
        "Service: $serviceName\nURL: $url\nHeaders: $headers\nBody: $body\nAuth: $maskedAuth";
    print(logMessage);
  }

  void logResponse(String serviceName, int statusCode, dynamic responseBody) {
    String logMessage =
        "Service: $serviceName\nStatus Code: $statusCode\nResponse Body: $responseBody";
    print(logMessage);
  }

  String _maskAuthInfo(String authType, Map<String, String> headers) {
    if (authType == 'JWT') {
      String jwt = headers['Authorization']?.split(' ').last?? '';
      return 'JWT ${jwt.substring(0, 5)}...';
    } else if (authType == 'OAuth') {
      return 'OAuth [masked]';
    }
    return 'Unknown';
  }
}
  1. 使用日志管理器
// 在网络请求处调用日志记录
Future<dynamic> makeRequest(String serviceName, String url,
    Map<String, String> headers, dynamic body, String authType) async {
  NetworkLogManager().logRequest(serviceName, url, headers, body, authType);
  // 实际的网络请求代码,这里假设使用http包
  try {
    var response = await http.post(Uri.parse(url), headers: headers, body: body);
    NetworkLogManager().logResponse(serviceName, response.statusCode, response.body);
    return response.body;
  } catch (e) {
    NetworkLogManager().logResponse(serviceName, -1, e.toString());
    return null;
  }
}