2012-03-22 101 views
8

在失敗時傳遞給回調的jQuery的jqXHR對象不解析json響應,因此responseJSON未定義,只有responseText可用。jquery ajax在解析失敗時不會解析json

它工作正常的成功請求,我設置使用dataType: 'json'

調用正確的標題:

$.ajax({ 
    type: 'POST', 
    url: $form.attr('action'), 
    data: post_data, 
    dataType: 'json', 
    done: done_callback, 
    fail: fail_callback, 
    always: always_callback 
    }); 

請求報頭:

Accept:application/json, text/javascript, */*; q=0.01 
X-Requested-With:XMLHttpRequest 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11 

響應頭:

Content-Type:application/json;charset=utf-8 
Status:500 

的responseText:

{"status":"error","code":500,"message":"A system error occurred, please try again later"} 

responseJSON是不確定的

難道jQuery不會解析JSON時,Ajax請求的響應是不成功的情況? 我無法找到任何文件,以證實或否認這種行爲(我可能只是不看夠硬)

我可以明明只是在fail回調使用parseJSON

+2

你說得對。響應內容不是錯誤的。如果您在500錯誤中收到JSON,請自行解析。 – Strelok 2012-03-22 12:01:19

+1

是的。 @Arun非常正確地指出了jquery已經採取這一決定的確切路線,不通過類型轉換器傳遞響應。 – Rob 2012-03-22 12:19:15

回答

12

我看看到jQuery的Ajax回調方法。只有當(status >= 200 && status < 300 || status === 304)爲真時,它纔會進行dataType轉換,否則響應會傳遞給相應的處理程序。這就是說,如果請求失敗,那麼響應不會按照預期的數據類型進行分析。

如果您想了解更多信息,您可以在jquery.js文件中查找以上條件並查看它的工作方式。

+1

確實,你有什麼想法,爲什麼jQuery的具體編碼,似乎很奇怪,響應數據是有效的,即使是錯誤。 HTTP1.1說「除了響應HEAD請求時,服務器應該包含一個包含錯誤情況說明的實體」 – Rob 2012-03-22 12:00:30

+0

我認爲這是因爲他們認爲如果請求失敗,則響應內容可能不可靠 – 2012-03-22 12:15:15

+1

這不再是真的:http://bugs.jquery.com/ticket/13917#comment:2「*從此提交:[...]解析JSON在失敗的情況下可用作jqXHR實例的responseJSON字段。*「 – Ashe 2013-11-27 01:46:42

0

我猜你正在尋找的是data.statusdata.statusText

+1

一個「數據」對象不會傳遞給失敗回調,只有成功,我希望我的json作爲一個對象 – Rob 2012-03-22 11:47:51

+0

這對我來說是新的,我創建的應用程序在一個web應用程序與約100個Ajax調用,我使用每一個'錯誤:函數(數據)alert(「data:」+ data.status +「」+ data.statusText); }'我沒有問題 – 2012-03-22 11:55:23

+1

data.statusText正是HTTP1.1定義的文本,在我的情況「內部服務器錯誤」這不是我想要的,我想要的類型鏈接後的實際響應對象,而不是XHR對象,就像你獲得成功回調一樣。例如。 「{error:」error「,status:500,message:」我們現在無法收到您的消息。「} – Rob 2012-03-22 12:07:06

1

因爲jQuery的1.5版本存在的StatusCode處理程序補充說:

$.ajax({ 
    statusCode: { 
    404: function() { 
     alert("page not found"); 
    } 
    } 
}); 

然而,在早期版本中,你應該單獨解析響應文本則返回錯誤狀態時:

$.ajax({ 
    success: function(response) { 
    data = $.evalJSON(response); 
    alert(data); 
    }, 
    error: function(response) { 
    data = $.evalJSON(response.responseText); 
    alert(data); 
    } 
}); 
+0

我認爲原生函數是parseJSON而不是evalJSON,我得到:」evalJSON不是函數「使用jQuery 1.11.0 – 2015-06-24 02:23:12