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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 10:30:28