Swift解码POST请求JSON响应失败的问题排查
问题分析与解决方案
核心问题出在POST请求返回的响应数据不符合Swift JSONDecoder的解析要求,且AWS API Gateway对POST和GET请求的响应处理存在差异,导致GET正常而POST失败。以下是具体排查方向和解决办法:
1. 先确认POST响应的实际内容
你看到Postman返回119,但Swift收到的响应可能存在隐藏字符(如换行、空格)或格式问题。先在代码中打印原始响应内容,确认数据细节:
let task = URLSession.shared.dataTask(with: urlRequest) { [weak self] data, _, error in guard let data = data, error == nil else { return } // 新增:打印原始响应字符串 if let responseStr = String(data: data, encoding: .utf8) { print("实际响应内容: '\(responseStr)'") print("响应长度: \(responseStr.count)") } do { let decoded = try JSONDecoder().decode(Int.self, from: data) DispatchQueue.main.async { self?.session_id = decoded } } catch { print("Error: something went wrong calling api posting session", error) } }
如果打印结果显示响应带空白字符(比如'119\n'),直接用JSONDecoder解码Int会失败,因为JSON不允许数字后带无关字符。这种情况下,手动修剪后转换即可:
if let responseStr = String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines), let sessionId = Int(responseStr) { DispatchQueue.main.async { self?.session_id = sessionId } }
2. 检查API Gateway的响应配置
AWS API Gateway对POST和GET请求的集成响应模板可能不一致,导致POST返回的不是标准JSON格式:
- 确认POST方法的Content-Type响应头是否设置为
application/json:如果返回的是text/plain,即使内容是数字,JSONDecoder也可能解析失败(部分场景下解析器会严格校验Content-Type)。 - 如果使用Lambda代理集成:Lambda返回的
body必须是JSON字符串。比如要返回数字119,Lambda代码需要返回{"statusCode":200, "body": JSON.stringify(119)},这样API Gateway会返回纯数字119而非字符串"119"。如果Lambda直接返回数字,API Gateway会自动转成字符串,导致Swift解码Int失败。 - 如果是非代理集成:检查响应模板是否正确,确保将Lambda的输出转换为合法JSON(比如设置模板为
$input.path('$'))。
3. 关于“线程问题”的误解
你提到解码String时出现线程问题,大概率是没在主线程更新UI/属性。正确的做法是:先完成字符串转Int的操作,再切换到主线程赋值,比如:
// 注意:如果响应是纯数字119,解码String会失败,因为JSON中119是数字类型而非字符串 // 所以更稳妥的是先转成String再手动转换 if let responseStr = String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines), let sessionId = Int(responseStr) { DispatchQueue.main.async { self?.session_id = sessionId } }
4. 后端返回JSON对象仍报错的原因
你修改后端返回标准JSON对象(如{"session_id":119})但仍报错,说明Swift收到的响应依然不是这个JSON对象,而是纯字符串。可能的原因:
- 后端修改未部署生效。
- API Gateway的POST响应模板覆盖了后端返回的内容,比如模板设置为直接返回Lambda的输出值而非整个JSON结构。
内容的提问来源于stack exchange,提问作者abhibabi
相关产品推荐
相关产品推荐

