URLSession请求服务器JSON数组失败,报NSURLErrorDomain Code=-999错误
Swift URLSession POST请求返回NSURLErrorDomain Code=-999的解决方法
问题核心现象
使用URLSession发起POST请求时,收到NSURLErrorDomain Code=-999(请求被取消)错误,服务器端PHP脚本未执行,且API在Web/Android平台可正常使用。
关键问题排查与修复方案
1. 修复POST请求头缺失问题
PHP的$_POST默认仅解析application/x-www-form-urlencoded格式的POST数据,原代码未设置该请求头,导致服务器无法识别参数,脚本逻辑无法触发。
2. 修正URL不一致问题
错误日志显示请求的URL为do_getblockedusers.php,但代码中写的是getHiddenUsers.php,需确认两者是否一致,重定向配置可能导致请求被意外取消。
3. 完善错误处理逻辑
原代码用try?忽略了解码错误,无法排查JSON解析问题;同时未检查HTTP响应状态码,无法确认服务器是否返回有效内容。
4. 确认请求生命周期
若请求在ViewController/ViewModel中发起,需确保对象在请求完成前不会被释放,避免任务被系统自动取消。
修改后的完整代码
guard let url = URL(string:"https://blaaaajo.de/getHiddenUsers.php") else { return } let postString = "blockedUsers=245,1150" var request = URLRequest(url: url) request.httpMethod = "POST" // 添加Content-Type头,让PHP正确解析POST参数 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpBody = postString.data(using: .utf8) Task { do { let (data, response) = try await URLSession.shared.data(for: request) // 验证响应状态码 guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("无效响应状态码") let responseContent = String(data: data, encoding: .utf8) ?? "无内容" print("服务器返回:\(responseContent)") gettingBlockedUsers = false return } // 捕获解码错误,而非忽略 let decodedResponse = try JSONDecoder().decode([HiddenUsersModel].self, from: data) gettingBlockedUsers = false blockedUsers = decodedResponse } catch { print("请求错误:\(error)") // 打印URL错误详情 if let urlError = error as? URLError { print("错误代码:\(urlError.code.rawValue)") print("错误描述:\(urlError.localizedDescription)") } gettingBlockedUsers = false } }
额外排查步骤
- 用Postman/curl测试API,确认传入
blockedUsers=245,1150时能正常返回JSON数组; - 在PHP脚本开头添加日志,验证是否收到请求:
file_put_contents('request_log.txt', date('Y-m-d H:i:s') . ' - 请求参数:' . print_r($_POST, true) . "\n", FILE_APPEND);
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

