Flutter中JSON字符串转对象请求API遇415错误的解决问询
解决API请求415错误的正确方式
问题根源
你的415错误核心原因有两个:
- 错误地将JSON数据放在URL的查询参数(
?job=$job)中,而非POST请求的**请求体(Body)**里——API期望接收application/json格式的请求体,而非URL参数中的字符串。 - 原始JSON字符串带有外层引号,本质是"字符串包裹的JSON",直接传递会被识别为普通字符串,而非合法的JSON对象。
处理步骤
1. 正确解析带外层引号的JSON字符串
原始字符串是外层被双引号包裹的JSON结构,需要先将其转换为合法的JSON对象:
// 假设原始带外层引号的字符串为 jobStr // 方式一:两次JSON解码 String innerJson = json.decode(jobStr); Map<String, dynamic> jobData = json.decode(innerJson); // 方式二:直接截取外层引号后解码 String innerJson = jobStr.substring(1, jobStr.length - 1); Map<String, dynamic> jobData = json.decode(innerJson);
2. 修正请求代码
将处理后的JSON对象放入请求体,同时移除URL中的查询参数:
var responseModel = await apiWrapper.makeRequest( 'Job/CreateNewJob', // 移除?job=$job参数 Request.post, jobData, // 将JSON对象作为请求体传入 isLoading ?? true, { 'Content-Type': 'application/json', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Authorization': 'Bearer $auth', }, );
3. 额外注意事项
如果你的apiWrapper.makeRequest方法不会自动将对象序列化为JSON字符串,需要手动序列化后传入:
// 手动转为JSON字符串 String jobJson = json.encode(jobData); var responseModel = await apiWrapper.makeRequest( 'Job/CreateNewJob', Request.post, jobJson, isLoading ?? true, { 'Content-Type': 'application/json', // 其他请求头保持不变 }, );
内容的提问来源于stack exchange,提问作者who-aditya-nawandar
相关产品推荐
相关产品推荐

