发起POST请求时未收到API响应,响应获取阶段出错
问题分析与修复方案
核心问题排查
你的代码存在几个关键问题,直接导致无法获取预期响应:
Content-Type拼写错误
你设置的是application/jason,正确的JSON内容类型应为application/json。这个拼写错误会让API无法正确解析请求体,直接返回错误响应。请求体序列化失败无处理
使用try? JSONSerialization.data(...)时,若序列化失败会返回nil,但代码未做任何错误提示,导致请求缺少有效请求体发送给API。忽略HTTP响应状态码
代码未获取并检查HTTPURLResponse的状态码,无法判断API返回的是成功(2xx)还是错误状态(如400参数错误、500服务器错误等),无法定位API端问题。错误处理不完整
- 请求出错时(
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
相关产品推荐
相关产品推荐

