如何在Swift中记录完整的POST请求?求可行示例
实现POST请求的完整日志记录(Swift)
没问题,我帮你把这个POST请求的完整日志记录功能补全,下面是基于你现有代码的实现,包含请求和响应的全链路日志,方便你调试和排查问题:
首先,确保你的ArrivalScan模型遵守Codable协议(这样才能把它转成JSON请求体):
struct ArrivalScan: Codable { // 根据你的实际业务定义属性,比如: let id: String let scanTime: Date // 其他需要传递的属性... }
接下来是完整的sendArrival函数,包含日志记录逻辑:
static func sendArrival(scan: ArrivalScan) { var urlComponents = URLComponents() urlComponents.scheme = "https" urlComponents.host = "api.my.url.com" urlComponents.path = "/Delivery/Arrival/" // 用queryItems管理URL参数,比直接拼path更规范,避免编码问题 urlComponents.queryItems = [URLQueryItem(name: "id", value: scan.id)] guard let url = urlComponents.url else { print("❌ 无法从组件创建URL") fatalError("Could not create URL from components") } var request = URLRequest(url: url) request.httpMethod = "POST" // 设置请求头,告诉服务器我们发送的是JSON格式 request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 1. 编码请求体 do { let requestBody = try JSONEncoder().encode(scan) request.httpBody = requestBody // 2. 记录请求的详细信息 logRequestDetails(request: request, body: requestBody) } catch { print("❌ 编码请求体失败:\(error.localizedDescription)") return } // 3. 发送请求并记录响应 let task = URLSession.shared.dataTask(with: request) { data, response, error in // 先处理请求错误 if let error = error { print("❌ 请求发送失败:\(error.localizedDescription)") return } // 记录响应的详细信息 logResponseDetails(response: response, data: data) } task.resume() } // 辅助函数:打印请求的全部细节 private static func logRequestDetails(request: URLRequest, body: Data?) { print("\n📤 发送POST请求:") print("URL: \(request.url?.absoluteString ?? "未知URL")") print("HTTP方法: \(request.httpMethod ?? "未知方法")") // 打印请求头 if let headers = request.allHTTPHeaderFields { print("请求头:") headers.forEach { key, value in print(" \(key): \(value)") } } // 把请求体转成可读的JSON字符串打印 if let body = body, let bodyString = String(data: body, encoding: .utf8) { print("请求体: \(bodyString)") } } // 辅助函数:打印响应的全部细节 private static func logResponseDetails(response: URLResponse?, data: Data?) { print("\n📥 收到响应:") // 处理HTTP响应 guard let httpResponse = response as? HTTPURLResponse else { print("⚠️ 收到非HTTP响应") return } print("状态码: \(httpResponse.statusCode)") print("响应头:") httpResponse.allHeaderFields.forEach { key, value in print(" \(key): \(value)") } // 把响应体转成可读的字符串打印 if let data = data, let responseString = String(data: data, encoding: .utf8) { print("响应体: \(responseString)") } }
几个关键细节说明:
- 请求体编码:利用Swift的
Codable协议自动完成模型到JSON的转换,避免手动拼接JSON字符串的麻烦和错误。 - 日志完整性:分别记录了请求的URL、方法、头、体,以及响应的状态码、头、体,覆盖了请求全链路的关键信息。
- URL参数优化:把原来直接拼在path里的
id参数改成用queryItems管理,这是苹果推荐的URL构建方式,能自动处理特殊字符的编码问题。 - 错误处理:增加了编码失败、请求失败的日志,方便快速定位问题。
如果后续需要更专业的日志管理(比如写入文件、按级别过滤),可以考虑集成第三方日志库,但上面的实现是无依赖的基础方案,足够日常调试使用。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

