jQuery Ajax返回200状态码却触发error回调问题排查
问题原因
AJAX配置中设置了dataType: 'json',该参数会强制jQuery将服务端返回的响应内容按JSON格式解析,只要解析失败,哪怕HTTP状态码返回200 OK,也会触发error回调。
从控制台输出的SyntaxError: Unexpected end of JSON input报错可以明确判断:服务端/Comment/EditC接口返回的响应体为空、或者不是完整合法的JSON格式,jQuery解析时直接遇到输入截断,最终抛出解析错误。
修复方案
根据接口实际设计选择对应方案即可:
- 接口无需返回业务数据,仅告知操作成功
- 前端侧修改:删除AJAX配置中的
dataType: 'json'项,或者将其改为dataType: 'text',取消jQuery强制JSON解析的逻辑,只要HTTP状态码为2xx就会正常进入success回调。修改后的参考代码如下:
- 前端侧修改:删除AJAX配置中的
function editComment(id) { var content = $('#Content').val(); var modelData = { 'Id': id, 'Content': content }; $.ajax({ type: 'POST', // 移除dataType: 'json'配置,或替换为dataType: 'text' url: '@Url.Action("EditC", "Comment")', data: JSON.stringify({ model: modelData }), contentType: 'application/json', success: function () { alert("YES"); }, error: function (xhr, textStatus, error) { console.log(xhr.responseText); console.log(xhr.statusText); console.log(textStatus); console.log(error); alert("Error"); } }); }
- 服务端侧修改:保持前端
dataType: 'json'配置不变,调整接口返回逻辑,确保始终返回合法JSON结构,哪怕无业务数据也要返回标准格式,比如ASP.NET MVC中可直接返回return Json(new { success = true });,保证响应体是可正常解析的JSON字符串。
- 接口设计上需要返回JSON数据
直接排查服务端EditC接口的逻辑:虽然返回了200状态码,但大概率是接口执行中途抛异常、响应内容被截断、JSON序列化逻辑出错,导致最终输出的不是完整合法JSON,调试接口查看实际返回的响应内容,修复序列化问题即可。
补充检查:你贴出的原始代码中$.ajax配置对象缺少闭合大括号,实际运行前请检查JS语法,避免语法错误导致代码无法执行。
内容的提问来源于stack exchange,提问作者ELOL
相关产品推荐
相关产品推荐

