You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:33:42