2012-03-22 22 views
8

jQueryのjqXHRオブジェクトは、失敗時にコールバックに渡され、json応答を解析しないため、responseJSONは定義されていません。jquery ajaxは失敗時に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 

それは成功した要求のために正常に動作します、私はdataType: 'json'

コールを使用して、正しいヘッダを設定しています

responseText:

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

responseJSONが

未定義であることは、Ajaxリクエストへの応答に失敗したときにjQueryはJSONを解析しない場合ですか?私は明らかにちょうどfailコールバックでparseJSONを使用することができ、私は、この動作を確認するか、拒否する任意のドキュメントを見つけることができません (私は十分に懸命に見ていないことができる)

+2

あなたが正しいです。レスポンスの内容は誤って評価されません。 500のエラーでJSONを受け取っている場合は、自分で解析してください。 – Strelok

+1

はい。 @ Arunは、jqueryがタイプコンバータを通して応答を渡さないようにこの決定を下した正確な行を私に非常に正しく指摘しました。 – Rob

答えて

12

だと思います。 (status >= 200 && status < 300 || status === 304)が真である場合にのみデータ型変換を行い、そうでない場合にはレスポンスが対応するハンドラに渡されます。つまり、要求が失敗であれば、応答は予期されたdataTypeに従って解析されません。

さらに詳しい情報が必要な場合は、上記の条件をjquery.jsファイルで探して、動作していることを確認できます。

+1

本当に、あなたにスポットがあります。jqueryが特にコード化している理由を知っていますか?非常に奇妙なようですが、エラーの場合でも応答データは有効です。 HTTP1.1は「HEAD要求に応答する場合を除いて、サーバーはエラー状況の説明を含むエンティティを含める必要があります」 – Rob

+0

これは、要求が失敗した場合に応答内容が信頼できるものではない –

+1

これはもはや真実ではありません:http://bugs.jquery.com/ticket/13917#comment:2 "*このコミット時点:[...]解析されたJSONは、jqXHRインスタンスのresponseJSONフィールドとして失敗した場合に利用できます。* " – Ashe

0

私は、あなたが探していることは、私はjQueryのAjaxのコールバックメソッドに見ていたdata.statusdata.statusText

+1

"データ"オブジェクトは失敗のコールバックに渡されません。成功のみ、オブジェクトとして私のjsonが欲しい – Rob

+0

これは私には新しいものです。すべての単一のエラー:機能(データ){ アラート( "データ:" + data.status + "" + data.statusText); } '問題はありません –

+1

data.statusTextは、私の場合「Internal Server Error」のHTTP1.1で定義されているテキストです。これは必要なものではありません。実際の応答オブジェクトはタイプチェインではなく、成功したコールバックを取得するのと同じように、XHRオブジェクト。例えば。 '{エラー:"エラー "、ステータス:500、メッセージ:"今はあなたのメッセージを受け取ることができません "}' – Rob

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を使う –

関連する問題