狀態碼爲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. 解決方案

這個問題的原因有兩個。

  1. 後端返回的json數據格式不規範
  2. HTTP狀態碼爲200,但是返回空的響應

所以後端在返回結果時,不要使用空的響應,也不應該去手動拼接JSON字符串,而應該交給響應的庫來實現JSON序列化字符串工作。

  • 方案1:如果後端確定響應體中不返回數據,那麼就把狀態碼設置爲204,而不是200。我一直逼着後端同事這麼做。
  • 方案2:如果後端接口想返回200,那麼請返回一個null或者{}去代替空響應
  • 方案3:別用jQuery的ajax,換個其他的庫試試

4. 參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章