2012-03-22 17 views
8

Obiekt jqXHR jQuery przekazany do wywołania zwrotnego w przypadku niepowodzenia nie analizuje odpowiedzi json, dlatego responseJSON jest niezdefiniowany tylko responseText jest dostępny.jquery ajax nie parsuje json na niepowodzenie

To działa dobrze dla pomyślnych żądań, ja ustawienie prawidłowych nagłówków za pomocą dataType: 'json'

połączenia:

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

Zapytanie nagłówki:

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 

nagłówki odpowiedzi:

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

responseText:

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

responseJSON jest niezdefiniowany

Czy to przypadek, że nie analizuje jQuery json, gdy odpowiedź na żądania ajax nie powiedzie? nie mogę znaleźć żadnej dokumentacji potwierdzenia lub zaprzeczenia tego zachowania (I mogłoby być po prostu nie patrząc na tyle twarde)

mogę oczywiście wystarczy użyć parseJSON w fail zwrotnego.

+2

Masz rację. Treść odpowiedzi nie jest "błędna". Jeśli otrzymujesz JSON na 500 błędach, spróbuj go samemu przeanalizować. – Strelok

+1

tak. @Arun dość słusznie wskazał mi dokładnie linię, którą jquery podjęła ta decyzja, aby nie przekazywać odpowiedzi poprzez konwertery typów. – Rob

Odpowiedz

12

musiałem zajrzeć do metody wywołania zwrotnego ajax jQuery. Wykonuje konwersję typu dataType tylko, jeśli (status >= 200 && status < 300 || status === 304) jest prawdziwe, w przeciwnym razie odpowiedź jest przekazywana jako taka do odpowiedniej procedury obsługi. To znaczy, jeśli żądanie jest niepowodzenie, odpowiedź nie jest analizowana zgodnie z oczekiwanym typem danych.

Jeśli chcesz uzyskać więcej informacji, możesz poszukać powyższego warunku w pliku jquery.js i zobaczyć, że działa.

+1

Rzeczywiście jesteś na miejscu.Czy masz jakiś pomysł, dlaczego jquery ma to specjalnie zakodowane, wydaje się bardzo dziwne, dane odpowiedzi są poprawne nawet w przypadku błędów. HTTP1.1 mówi "Z wyjątkiem sytuacji, gdy odpowiada na żądanie HEAD, serwer powinien zawierać encję zawierającą wyjaśnienie sytuacji błędu" – Rob

+0

Myślę, że dzieje się tak, ponieważ zakładają one, że jeśli żądanie jest nieudane, zawartość odpowiedzi może nie być niezawodna –

+1

To już nie jest prawda: http://bugs.jquery.com/ticket/13917#comment:2 "* Od tego zatwierdzenia: [...] parsowany JSON jest dostępny w przypadku awarii jako pole responseJSON instancji jqXHR . * " – Ashe

0

Chyba to, czego szukasz, jest data.status i data.statusText

+1

Obiekt "data" nie jest przekazywany do callbacków niepowodzeń, tylko sukces, chcę, aby mój json był obiektem – Rob

+0

To byłaby dla mnie nowa aplikacja, którą buduję w momencie aplikacji internetowej z około 100 wywołań ajaxowych i używam w każdy pojedynczy alert "błąd: funkcja (dane) { (" dane: "+ data.status +" "+ data.statusText); } "Nie mam z tym żadnych problemów –

+1

data.statusText jest dokładnie tym tekstem zdefiniowanym przez HTTP1.1 w moim przypadku" Wewnętrzny błąd serwera "to nie jest to czego chcę, chcę rzeczywisty obiekt odpowiedzi po łańcuchowaniu typu, a nie Obiekt XHR, tak jak w przypadku powodzenia oddzwaniania. na przykład. '{error:" error ", status: 500, message:" Nie możemy teraz odebrać twojej wiadomości. "}' – Rob

1

Od wersji 1.5 jQuery jest statusCode obsługi dodania:

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

Jednak we wcześniejszych wersjach należy analizować tekst odpowiedzi osobno gdy stan zwracany jest błąd:

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

Myślę, że natywną funkcją jest parseJSON nie evalJSON, otrzymuję:" evalJSON nie jest funkcją "przy użyciu jQuery 1.11.0 –