乐趣区

状态码为200时 jQuery ajax报错

1. 问题现象
HTTP 状态码为 200 OK 时,jquery ajax 报错
2. 问题原因
jquery ajax 的 dataType 字段包含:json, 但是服务端返回的数据不是规范的 json 格式,导致 jquery 解析 json 字符串报错,最终导致 ajax 报错。
jQuery ajax 官方文档上说明:
“json”: Evaluates the response as JSON and returns a JavaScript object. Cross-domain “json” requests are converted to “jsonp” unless the request includes jsonp: false in its request options. The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. (See json.org for more information on proper JSON formatting.)
设置 dataType 为 json 时,jquery 就会去解析响应体为 JavaScript 对象。跨域的 json 请求会被转化成 jsonp, 除非设置了 jsonp: false。JSON 数据会以严格模式去解析,任何不规范的 JSON 字符串都会解析异常并抛出错误。从 jQuery 1.9 起,一个空的响应也会被抛出异常。服务端应该返回一个 null 或者 {} 去代替空响应。参考 json.org, 查看更多内容
3. 解决方案
这个问题的原因有两个。

后端返回的 json 数据格式不规范
HTTP 状态码为 200,但是返回空的响应

所以后端在返回结果时,不要使用空的响应,也不应该去手动拼接 JSON 字符串,而应该交给响应的库来实现 JSON 序列化字符串工作。

方案 1:如果后端确定响应体中不返回数据,那么就把状态码设置为 204,而不是 200。状态码为 204 时,jQuery 就知道响应体中没有数据,也不需要去解析。我一直逼着后端同事这么做。

方案 2:如果后端接口想返回 200,那么请返回一个 null 或者 {} 去代替空响应

方案 3:别用 jQuery 的 ajax,换个其他的库试试

4. 参考

Ajax request returns 200 OK, but an error event is fired instead of success
jQuery.ajax

退出移动版