Swift发送Codable结构体请求被Express识别为单键JSON的原因求解
问题原因
你遇到的异常是因为未给URLRequest设置正确的请求头,后台将JSON格式的请求体错误识别为x-www-form-urlencoded表单格式,因此会把整个JSON字符串解析为表单的键名,对应值为空,完全匹配你给出的后台接收结果。
解决步骤
- 核心修复:在构造请求的代码中添加
Content-Type声明,在request.httpMethod = method代码后新增一行:
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
- 验证编码正确性:添加调试代码确认JSONEncoder输出的结构符合预期,排除编码逻辑异常:
let requestData = try? JSONEncoder().encode(data) // 新增调试代码 if let data = requestData, let jsonStr = String(data: data, encoding: .utf8) { print("编码后请求体:\(jsonStr)") // 正常输出应为:{"email":"test","password":"test2"} }
- 排查底层逻辑:检查网络封装是否存在二次处理httpBody的逻辑,比如将已经编码好的JSON数据又作为参数传入表单序列化方法,导致重复编码。
- 确认Encoder配置:如果你的JSONEncoder有自定义配置,检查是否存在
keyEncodingStrategy等异常配置,默认配置不会引发该问题。
内容的提问来源于stack exchange,提问作者evanvono
相关产品推荐
相关产品推荐

