当前位置: 首页 > 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)")
}

http://www.lqws.cn/news/551827.html

相关文章:

  • 【Bluedroid】蓝牙启动之BTM_reset_complete源码解析
  • GitHub Actions 实现 AWS ECS 服务的多集群安全重启方案
  • 《剖开WebAssembly 2.0:C++/Rust内存管理困局与破局》
  • 移动端日志平台EMAS
  • 接口自动化测试框架详解
  • 领域驱动设计(DDD)【22】之限定建模技术
  • 现代串口通讯UI框架性能对比
  • 【数据标注师】目标跟踪标注
  • 【MySQL数据库 | 第十篇】DCL语句----用户管理+权限控制
  • 商业秘密中经营信息的法律保护探析——以客户名册为例
  • ZooKeeper深度面试指南二
  • SpringMVC系列(七)(Restful架构风格(下))(完结篇)
  • 什么是哈希链(Hash Chain)?
  • 计算机组成原理-数据表示与运算(三)
  • 【数据结构】AVL树和红黑树的Insert(插入)(实现map.insert)
  • SpringBoot 防刷 重复提交问题 重复点击问题 注解 RequestParam RequestBody
  • 如何在 Manjaro Linux 上安装 Deepin 桌面
  • 构建证据的系统性知识体系:从理论到实践的完整指南
  • MyBatis 缓存机制详解
  • Python打卡:Day39
  • Java--数组
  • python打卡day56
  • 智能助手(利用GPT搭建智能系统)
  • Netty 的 PooledByteBuf与PooledHeapByteBuf​​
  • Day44 预训练模型
  • MySQL 连接指定端口后,为什么实际仍是 3306?
  • 【深度学习新浪潮】MoE技术入门(简要版)
  • 基于JavaWeb的校园失物招领系统设计与实现
  • 智能制造数字孪生集成交付生态链:智慧产线极速克隆,孪生重构生产周期
  • 飞牛OS安装zerotier组自己的虚拟局域网