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

发起POST请求时未收到API响应,响应获取阶段出错

问题分析与修复方案

核心问题排查

你的代码存在几个关键问题,直接导致无法获取预期响应:

  1. Content-Type拼写错误
    你设置的是application/jason,正确的JSON内容类型应为application/json。这个拼写错误会让API无法正确解析请求体,直接返回错误响应。

  2. 请求体序列化失败无处理
    使用try? JSONSerialization.data(...)时,若序列化失败会返回nil,但代码未做任何错误提示,导致请求缺少有效请求体发送给API。

  3. 忽略HTTP响应状态码
    代码未获取并检查HTTPURLResponse的状态码,无法判断API返回的是成功(2xx)还是错误状态(如400参数错误、500服务器错误等),无法定位API端问题。

  4. 错误处理不完整

    • 请求出错时(error != nil)直接return,未打印错误信息,无法排查请求阶段问题;
    • JSON解析失败时仅打印error,未查看原始响应数据,无法判断是API返回非JSON数据导致解析失败。

修复后的代码

@IBAction func onTapContinue(_ sender: UIButton) {
    registerData["otp_code"] = codeTextField.text
    print("Registration Check \(registerData)")
    apiCall()
}

extension VerificationCodeVC {
    func apiCall (){
        guard let url = URL(string: "https://admin.sapid.mx/api/register") else {
            print("Error: cannot create URL")
            return
        }
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        // 修复Content-Type拼写错误
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        
        // 处理序列化失败的情况,避免用try?隐藏错误
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: registerData, options: .fragmentsAllowed)
        } catch {
            print("Failed to serialize request body: \(error)")
            return
        }
        
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            // 优先处理请求错误
            if let error = error {
                print("Request error: \(error)")
                return
            }
            
            // 校验HTTP响应并打印状态码
            guard let httpResponse = response as? HTTPURLResponse else {
                print("Invalid response format")
                return
            }
            print("Response status code: \(httpResponse.statusCode)")
            
            // 校验响应数据
            guard let data = data else {
                print("No response data received")
                return
            }
            
            // 打印原始响应数据,方便排查解析问题
            if let rawResponse = String(data: data, encoding: .utf8) {
                print("Raw response content: \(rawResponse)")
            }
            
            // 解析响应JSON
            do {
                let response = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                print("Success response: \(response)")
            } catch {
                print("JSON parsing error: \(error)")
            }
        }
        task.resume()
    }
}

额外建议

  • 运行修复后的代码,通过控制台打印的状态码和原始响应数据,可直接判断是API返回的错误信息还是客户端问题;
  • 若API返回错误状态码(如400),根据原始响应中的错误提示调整请求参数;
  • 建议使用Codable替代JSONSerialization,序列化/反序列化更安全、可读性更高。

内容的提问来源于stack exchange,提问作者Hamid Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:42:24