Swift 4中UITextField向服务器提交数据时参数为空问题求助
解决Swift 4 POST请求参数为空的问题
嘿,作为Swift新手遇到这个问题太正常了,我帮你梳理下代码里的核心问题,再给你修正后的方案:
问题根源
- TextField的text是可选值:你直接把
departmentTextField.text这类可选类型的值塞进字典,服务器收到的要么是带Optional()包裹的字符串,要么是nil,自然解析为空。 - 请求体格式不匹配:你设置了
Content-Type为application/x-www-form-urlencoded,但根本没把字典转换成对应格式的字符串(比如key1=value1&key2=value2),反而直接把字典转成Data,这完全不符合该格式的要求。 - 无效的Data转换:
(postString as AnyObject).data这种写法根本生成不了正确的请求体数据,属于错误的转换方式。
修正步骤
- 先处理所有TextField的可选值,用
?? ""把nil转为空字符串,确保字典里都是非可选的String类型。 - 把字典转换成
x-www-form-urlencoded格式的键值对字符串,还要对键值做URL编码,避免特殊字符破坏格式。 - 将编码后的字符串转成UTF-8格式的Data作为请求体。
- 注意:UI操作必须在主线程执行,原代码里的弹窗直接在后台线程调用会崩溃。
修正后的完整代码
// 1. 处理可选值,构建非可选的参数字典 let params: [String: String] = [ "departement": departmentTextField.text ?? "", "fname": firstNameTextField.text ?? "", "lname": lastNameTextField.text ?? "", "email": emailTextField.text ?? "", "mbl": mobileNumberTextField.text ?? "", "address": residentialTextField.text ?? "", "subrub": suburbTextField.text ?? "", "dob": chooseDateofBTextField.text ?? "", "gender": genderTextField.text ?? "", "cardno": medicareCardNoTextField.text ?? "", "edate": medicareExpiryTextField.text ?? "", "source": howDidText.text ?? "", "condition": conditionTextField.text ?? "", "appdate": aptDOPTextField.text ?? "" ] // 2. 将字典转换为x-www-form-urlencoded格式的字符串(带URL编码) var postString = "" for (key, value) in params { guard let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { continue } postString += postString.isEmpty ? "" : "&" postString += "\(encodedKey)=\(encodedValue)" } guard let url = URL(string: "//myAPI") else { print("无效的API地址") return } var request = URLRequest(url: url) request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" // 3. 将编码后的字符串转为Data作为请求体 request.httpBody = postString.data(using: .utf8) let task = URLSession.shared.dataTask(with: request) { data, response, error in // 所有UI操作必须切回主线程 DispatchQueue.main.async { guard let data = data, error == nil else { print("请求错误:\(error ?? "未知错误" as! Error)") let alert = UIAlertController(title: "连接失败", message: "请稍后重试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) return } if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { print("状态码异常:\(httpStatus.statusCode)") print("响应详情:\(response!)") let alert = UIAlertController(title: "请求失败", message: "服务器返回错误状态码:\(httpStatus.statusCode)", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) return } let responseString = String(data: data, encoding: .utf8) print("服务器响应:\(responseString ?? "无响应内容")") let alert = UIAlertController(title: "预约成功", message: "", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) } } task.resume()
内容的提问来源于stack exchange,提问作者Bilal Mughal
相关产品推荐
相关产品推荐

