Swift POST请求无法返回正确响应码,求排查建议
排查方向与解决建议
1. 先获取实际响应状态码,不要直接过滤
你当前的代码直接在guard里判断状态码必须为200,导致无法知道服务器实际返回的状态(比如400参数错误、401权限问题等)。先修改响应处理逻辑,打印真实的响应信息:
let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in // 先捕获网络底层错误 if let error = error { print("网络请求错误:\(error.localizedDescription)") completion(.failure(.networkError(error))) return } // 解析HTTP响应并打印关键信息 guard let httpResponse = response as? HTTPURLResponse else { print("非HTTP响应") completion(.failure(.responseProblem)) return } print("实际响应状态码:\(httpResponse.statusCode)") print("响应头信息:\(httpResponse.allHeaderFields)") // 再判断状态码是否为200 guard httpResponse.statusCode == 200 else { completion(.failure(.invalidStatusCode(httpResponse.statusCode))) return } // 最后检查返回数据 guard let jsonData = data else { print("无返回数据") completion(.failure(.responseProblem)) return } // 后续解码逻辑... }
注:需要给APIError新增networkError(Error)和invalidStatusCode(Int)枚举值,方便定位问题
2. 验证请求体编码是否符合服务器要求
当前用JSONEncoder编码请求体,但部分服务器可能要求表单编码(application/x-www-form-urlencoded)而非JSON。可以两种格式都测试:
测试JSON格式(当前逻辑)
确认服务器是否真的接受application/json类型,可替换编码方式为JSONSerialization对比结果:
let finalBody = try JSONSerialization.data(withJSONObject: body)
测试表单编码格式
// 对邮箱地址做URL编码,避免特殊字符问题 let encodedEmail = emailToSend.email.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" let bodyString = "email=\(encodedEmail)" request.httpBody = bodyString.data(using: .utf8) request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
3. 修正代码中的无效打印逻辑
你当前的print(completion(.failure(.responseProblem)))是错误的——completion是闭包,调用后返回Void,打印结果只会是()。应改为打印具体错误描述:
// 错误示例 // print(completion(.failure(.responseProblem))) // 正确写法 print("响应异常:未获取到200状态码或返回数据") completion(.failure(.responseProblem))
4. 用第三方工具验证请求有效性
用curl或Postman直接发送相同请求,排除服务器端问题:
curl -X POST -H "Content-Type: application/json" -d '{"email":"你的测试邮箱"}' 你的resourceURL
如果工具能返回200,问题在客户端代码;如果工具也无法返回200,需检查服务器接口配置或参数要求。
5. 确认模型解码与服务器返回结构匹配
即使状态码为200,若服务器返回的JSON结构与Email模型不匹配,也会触发解码失败。可先打印返回的JSON字符串:
if let jsonString = String(data: jsonData, encoding: .utf8) { print("服务器返回JSON:\(jsonString)") }
对比Email模型的属性,比如服务器是否返回额外字段(如{"status":"success","email":"xxx"}),若有则需调整模型结构。
内容的提问来源于stack exchange,提问作者CastDaFunk
相关产品推荐
相关产品推荐

