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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:32:56