SwiftUI新手POST API请求遇500错误及JSON解析失败求助
解决SwiftUI POST请求500错误及JSON解析失败问题
你遇到的两个问题是直接关联的:服务器返回500内部错误(HTML格式内容),导致后续尝试把HTML解析成JSON时失败,抛出NSCocoaErrorDomain Code=3840错误。以下是具体排查和修复步骤:
1. 先删掉无用代码
你的代码里有一段把User-Agent字典转成JSON字符串的逻辑,完全是多余的——HTTP头的User-Agent只需要直接设置字符串值就行,不需要转JSON。删掉这段代码减少冗余:
// 移除以下无效代码: let userAgentHeader = ["User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"] guard let headerData = try? JSONSerialization.data(withJSONObject: userAgentHeader, options: []), let headerJSON = String(data: headerData, encoding: .utf8) else { print("Failed to convert User-Agent header dictionary to JSON string") return }
2. 排查请求核心问题
服务器返回500错误,优先确认客户端请求是否符合API规范:
- 检查URL正确性:确认传入的
url变量是否指向正确的API端点,有没有拼写错误、环境(测试/生产)混淆的情况。 - 验证请求体格式:用
print(reqString)输出的请求体,核对JSON字段名是否和服务器要求完全匹配(注意大小写、下划线/驼峰格式),有没有遗漏必填字段。也可以用Postman、curl等工具发送相同请求,排除客户端代码外的问题。 - 检查HTTP头:你已经设置了
Content-Type: application/json,这是正确的,但要确认服务器是否要求其他必填头(比如Authorization、API Key等)你没添加。
3. 优化响应处理逻辑
先判断响应状态码,再决定是否解析JSON,避免无效的解析操作:
URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error: \(error)") return } guard let httpResponse = response as? HTTPURLResponse else { print("Invalid response") return } // 先校验状态码,非2xx直接输出错误详情 guard (200...299).contains(httpResponse.statusCode) else { print("Server error code: \(httpResponse.statusCode)") if let responseString = String(data: data ?? Data(), encoding: .utf8) { print("Server error content: \(responseString)") } return } guard let data = data else { print("No data received") return } // 仅在状态正常时解析JSON do { let json = try JSONSerialization.jsonObject(with: data) print("Response JSON: \(json)") } catch { print("Error parsing JSON: \(error)") } }.resume()
额外建议
- 用
JSONDecoder配合自定义模型结构体解析响应,比JSONSerialization更类型安全,也更容易定位解析问题。 - 用Charles或Proxyman抓包,完整查看请求的头、请求体、响应细节,这是排查API问题最直接的方式。
内容的提问来源于stack exchange,提问作者Manish kumar
相关产品推荐
相关产品推荐

