当前位置: 首页 > news >正文

Swift Moya自定义插件打印日志

如何用Moya自定义插件打印网络请求日志

Moya本身不提供详细的日志打印功能,但可以通过自定义插件来实现。以下步骤展示如何创建并配置一个日志插件。

创建自定义日志插件

定义一个遵守PluginType协议的插件类,实现必要的协议方法:

import Moyafinal class NetworkLoggerPlugin: PluginType {func willSend(_ request: RequestType, target: TargetType) {guard let urlRequest = request.request else { return }print("\n🚀 Request:")print("URL: \(urlRequest.url?.absoluteString ?? "")")print("Method: \(urlRequest.httpMethod ?? "")")print("Headers: \(urlRequest.allHTTPHeaderFields ?? [:])")if let body = urlRequest.httpBody, let bodyString = String(data: body, encoding: .utf8) {print("Body: \(bodyString)")}}func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {switch result {case .success(let response):print("\n✅ Response:")print("Status Code: \(response.statusCode)")print("Headers: \(response.response?.allHeaderFields ?? [:])")if let json = try? response.mapJSON() {print("Response Data: \(json)")} else if let string = try? response.mapString() {print("Response Data: \(string)")}case .failure(let error):print("\n❌ Error:")print("Error: \(error.localizedDescription)")}}
}

将插件添加到Moya Provider

创建Moya Provider实例时,将自定义插件添加到plugins数组中:

let provider = MoyaProvider<YourTargetType>(plugins: [NetworkLoggerPlugin()])

优化日志输出格式

如果需要更美观的日志输出,可以改进打印格式:

func willSend(_ request: RequestType, target: TargetType) {guard let urlRequest = request.request else { return }let output = """\n╔═══════════════════════════════════════════════════════════║ 🚀 Request║ URL: \(urlRequest.url?.absoluteString ?? "")║ Method: \(urlRequest.httpMethod ?? "")║ Headers: \(urlRequest.allHTTPHeaderFields ?? [:])║ Body: \(urlRequest.httpBody.flatMap { String(data: $0, encoding: .utf8) } ?? "None")╚═══════════════════════════════════════════════════════════"""print(output)
}

使用第三方日志库

对于更专业的日志记录,可以集成CocoaLumberjack等日志库:

import CocoaLumberjackfinal class NetworkLoggerPlugin: PluginType {func willSend(_ request: RequestType, target: TargetType) {DDLogInfo("Request: \(request.request?.url?.absoluteString ?? "")")}func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {switch result {case .success(let response):DDLogInfo("Response: \(response.statusCode)")case .failure(let error):DDLogError("Error: \(error.localizedDescription)")}}
}

过滤敏感信息

在打印日志时,建议过滤掉授权头等敏感信息:

func willSend(_ request: RequestType, target: TargetType) {guard let urlRequest = request.request else { return }var headers = urlRequest.allHTTPHeaderFields ?? [:]headers["Authorization"] = headers["Authorization"] != nil ? "*****" : nilprint("Headers: \(headers)")
}

相关文章:

  • 磁悬浮轴承气隙设计深度解析:微米间的生死时速
  • 蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体
  • Eplan2022导入edz文件并插入使用
  • Java 使用 Easy Excel 进行 Excel 数据导入导出
  • Linux基本指令篇 —— less指令
  • GeoTools 结合 OpenLayers 实现属性查询
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-118节(继承)
  • 《红黑树实现》
  • 基于esp32s3的自定义唤醒词识别-单元测试
  • 基于CNN卷积神经网络图像识别小程序9部合集
  • 【算法深练】单调栈:有序入栈,及时删除垃圾数据
  • 2.搭建Pytorch神经网络进行气温预测
  • 数据湖 vs 数据仓库:数据界的“自来水厂”与“瓶装水厂”?
  • 表达式求值
  • Launcher3中的CellLayout 和ShortcutAndWidgetContainer 的联系和各自职责
  • 华为云镜像仓库下载 selenium/standalone-chrome 镜像
  • SQL关键字三分钟入门:ROW_NUMBER() —— 窗口函数为每一行编号
  • 深度学习-分类
  • Sensodrive SensoJoint机器人力控关节模组抗振动+Sensodrive力反馈系统精准对接
  • web3 docs