Swift结构体转JSON发送至Node.js时格式异常的解决求助
解决Swift到Node.js的JSON格式异常问题
你的问题核心是请求头配置缺失导致Node.js端无法正确解析JSON请求体,下面一步步帮你解决:
1. 修复Swift请求的Content-Type头
你的Swift代码里没有告诉服务器发送的是JSON格式的数据,这会让Node.js的解析中间件错误地把JSON当成表单数据处理,导致结构混乱。在设置request.httpBody之后添加以下代码:
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
另外,建议你把Swift里打印jsonData的代码改成打印字符串,方便验证JSON格式是否正确:
if let jsonString = String(data: jsonData, encoding: .utf8) { print("JSON Value: \(jsonString)") }
2. 确保Node.js正确配置JSON解析中间件
检查你的Node.js主文件(比如app.js),确保已经启用了body-parser的JSON解析中间件,如果还没加,添加以下代码:
const bodyParser = require('body-parser'); // 解析JSON格式的请求体 app.use(bodyParser.json()); // 如果需要处理表单数据可以保留,但JSON解析必须在前 app.use(bodyParser.urlencoded({ extended: true }));
3. 简化Node.js路由的解析逻辑
当请求头和中间件配置正确后,request.body就是完整的解析后的JSON对象,不需要再去取Object.keys(request.body)[0]然后手动parse了,直接使用request.body即可:
app.post("/rapportini/generarapportino", async function(request, response) { console.log("\n Qualcuno sta generando un rapportino"); try { console.log("Parsed body: ", request.body); const ret = await RapportiniController.GeneraRapportino(request.body.Note); response.setHeader('Content-Type', 'application/json'); response.send(JSON.stringify({ return: ret })); } catch(err){ console.log("Errore generazione rapportino ", err); // 建议添加错误响应,让客户端知道出了问题 response.status(500).send(JSON.stringify({ error: err.message })); } });
为什么之前会报错?
因为你没有设置Content-Type: application/json请求头,Node.js的body-parser默认会把请求体当成application/x-www-form-urlencoded(表单格式)解析,把你的JSON字符串拆成了残缺的键值对(就像你服务器打印的那样),当你尝试JSON.parse那个不完整的JSON片段时,自然会抛出Unexpected end of JSON input错误。
内容的提问来源于stack exchange,提问作者riki
相关产品推荐
相关产品推荐

