import Foundation // 可选:定义响应模型(根据你的实际返回结构调整) //struct LoginResponse: Codable { // let code: Int? // let message: String? // let [String: AnyCodable]? // 或具体结构,如 token, userId 等 //} // 因为 Dictionary 不能直接 Codable,这里用 AnyCodable 简化 //enum AnyCodable: Codable {} func passwordLogin(username: String, password: String) { guard let url = URL(string: "https://api.memorywake.com/api/v1/iam/login/password-login") else { print("❌ 无效的URL") return } // 1. 创建 URLRequest var request = URLRequest(url: url) request.httpMethod = "POST" // 2. 设置请求头 request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 如果接口需要,也可以加 User-Agent 或其他 header request.setValue("iOS App", forHTTPHeaderField: "User-Agent") // 3. 准备参数 let parameters = [ "account": username, "password": password ] // 4. 将参数编码为 JSON do { request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) } catch { print("❌ 参数序列化失败: \(error)") return } // 5. 发送请求 let task = URLSession.shared.dataTask(with: request) { data, response, error in // 回调在后台线程,更新 UI 需切主线程 DispatchQueue.main.async { if let error = error { print("网络错误: \(error)") return } // 检查状态码 if let httpResponse = response as? HTTPURLResponse { print("状态码: \(httpResponse.statusCode)") if httpResponse.statusCode == 404 { print("⚠️ 接口未找到,请确认:") print("1. 后端服务是否正在运行?") print("2. IP 和端口是否正确?") print("3. 网络是否在同一局域网?") return } else if httpResponse.statusCode != 200 { print("服务器错误: \(httpResponse.statusCode)") } } // 处理返回数据 guard let data = data else { print("❌ 无返回数据") return } // 打印原始响应(调试用) if let jsonString = String(data: data, encoding: .utf8) { print("响应内容: \(jsonString)") } // 尝试解析为 JSON 字典 do { if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { print("解析成功: \(json)") // 如果你有明确的模型,可以用 JSONDecoder 解码 LoginResponse // let decoder = JSONDecoder() // let loginResult = try decoder.decode(LoginResponse.self, from: data) } } catch { print("❌ JSON 解析失败: \(error)") } } } // 启动请求 task.resume() }