Swift API调用时参数未传递问题求助
Swift API调用时参数未传递问题求助
嘿,我看了你的代码和返回结果,发现API没接收到你传的email和password,导致服务器返回“邮箱字段必填”的错误。咱们来排查几个关键问题:
问题1:请求头的Content-Type格式错误
你写的是application/JSON,但标准的MIME类型是小写的application/json,有些服务器对大小写敏感,会导致无法正确解析请求体里的JSON参数。
问题2:变量名可能存在大小写或作用域问题
代码里的Email和Password是你的输入变量吗?Swift是严格区分大小写的,如果你的输入框绑定的是小写的email或password,这里大写的变量名就会取不到值,传空给API。另外,你把apiCall()函数定义在Task的闭包内部,要确保这两个变量在函数作用域内是可访问的。
问题3:JSON序列化的选项可能没必要
.fragmentsAllowed选项是用来序列化非完整JSON(比如单个字符串或数字)的,这里你传的是完整的字典,用默认选项就好,多余的选项可能干扰序列化过程。
修正后的代码
我把代码改成了更规范的async/await写法,同时修复了上面的问题:
Button(action: { Task { // 先打印验证输入值,确认不是空字符串 print("当前输入的邮箱:\(Email),密码:\(Password)") await apiCall(email: Email, password: Password) } }) { Text("登录") // 替换成你的按钮文本 } // 把API调用函数放到外部,更易维护且作用域清晰 func apiCall(email: String, password: String) async { let endpoint = "https://new.demozab.com/cryptoco/mobileapi/public/api/login" guard let url = URL(string: endpoint) else { print("无效的API地址") return } var request = URLRequest(url: url) // 修正Content-Type为标准格式 request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" let parameters: [String: AnyHashable] = [ "email": email, "password": password, "device_id" : "abcdef", "device_type" : "ios", "ip" : "0.0.0.0" ] do { // 使用默认序列化选项 request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) } catch let error { print("参数序列化失败:\(error.localizedDescription)") return } do { // 用async/await替代传统dataTask,代码更简洁 let (data, response) = try await URLSession.shared.data(for: request) // 打印状态码,方便排查服务器响应 if let httpResponse = response as? HTTPURLResponse { print("服务器状态码:\(httpResponse.statusCode)") } let responseResult = try JSONSerialization.jsonObject(with: data, options: []) print("API响应:\(responseResult)") } catch { print("API调用失败:\(error.localizedDescription)") } }
额外排查建议
- 如果打印出来的
Email或Password是空的,那问题出在输入框的绑定逻辑上,和API调用无关,需要检查输入框的变量绑定是否正确。 - 可以用Postman手动传参数测试API,确认服务器端本身能正常接收参数,排除服务器的问题。
备注:内容来源于stack exchange,提问作者Fayith
相关产品推荐
相关产品推荐

