iOS Swift中POST请求无法传递参数问题排查求助
解决POST请求参数无法传递的问题
我帮你排查了代码里的关键问题,这就给你分析原因和修正方案:
核心问题点
- 缺少
Content-Type请求头:服务器需要明确知道你发送的数据格式,否则无法正确解析请求体里的参数。你的代码没设置这个头,服务器大概率把请求体当成普通文本处理,自然拿不到参数。 - 多余的字符串转码步骤:你把
jsonData转成字符串再转回Data,这一步完全没必要,还可能因为编码问题导致数据损坏,直接用原始的jsonData作为请求体就好。 - 强制解包风险:原代码里用了
jsonData!和str!,一旦JSON转Data失败或者字符串转码失败,会直接崩溃,用do-catch和可选绑定更安全。
修正后的完整代码
import UIKit // 构造请求参数 let json: [String: Any] = [ "set_id" : "20", "user_id" : "30", "type" : "contact", "contact_name" : "shinto" ] do { // 将JSON转为Data,用do-catch处理转换失败的情况 let jsonData = try JSONSerialization.data(withJSONObject: json) guard let url = URL(string: "****.php") else { print("URL格式错误") return } var request = URLRequest(url: url) // 请求方法用大写(规范写法,避免部分服务器兼容问题) request.httpMethod = "POST" // 关键:添加Content-Type头,告诉服务器这是JSON格式数据 request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 直接使用jsonData作为请求体,跳过多余的字符串转码 request.httpBody = jsonData let session = URLSession(configuration: .default) let task = session.dataTask(with: request) { (data, response, error) in // 优先处理错误 if let error = error { print("请求出错:\(error.localizedDescription)") return } // 处理服务器响应 if let data = data, let postResponse = String(data: data, encoding: .utf8) { print("服务器返回:\(postResponse)") } } task.resume() } catch { print("JSON转Data失败:\(error.localizedDescription)") }
额外调试建议
- 检查服务器端逻辑:如果是PHP接收,要使用
file_get_contents('php://input')读取JSON请求体,$_POST只处理表单格式(application/x-www-form-urlencoded)的数据,无法直接获取JSON参数。 - 抓包验证请求:用Charles或Proxyman工具抓包,确认请求头和请求体是否正确发送,方便定位是客户端还是服务器的问题。
内容的提问来源于stack exchange,提问作者SHINTO JOSEPH
相关产品推荐
相关产品推荐

