2010-09-18 14 views
61

Jak określić typ odpowiedzi wywołania ajax w Jquery? Czasami serwer wysyła odpowiedź json i czasami wysyła tylko html do celów wyświetlania. Teraz używamjquery, jak sprawdzić typ odpowiedzi dla wywołania ajax

if(response.indexOf('Error')) 
    //popup error message 
else 
response.username 
response.address 
+1

Możesz to sprawdzić poprzez 'odpowiedź typeof ==" obiekt "' – Imdad

+0

Czy próbowałeś spojrzeć na nagłówek typu MIME odpowiedzi? – Dick

Odpowiedz

106

Można spróbować to lubią:

$.ajax({ 
    type: "POST", 
    url: "your url goes here", 
    data: "data to be sent", 
    success: function(response, status, xhr){ 
    var ct = xhr.getResponseHeader("content-type") || ""; 
    if (ct.indexOf('html') > -1) { 
     //do something 
    } 
    if (ct.indexOf('json') > -1) { 
     // handle json here 
    } 
    } 
}); 

Zasadniczo jest również przy użyciu indexOf ale wydaje się bardziej wiarygodne.

+0

BTW Proponuję, abyś używał tylko jednego formatu, jeśli to możliwe. Nawet jeśli wyświetlasz jakąś prostą wiadomość, możesz również użyć json. –

+0

Wielkie dzięki. To jest dokładnie to, co szukam lub. Żałuję, że jquery nie ma na to skrótu :) – sam

+0

Dzięki za to ... powinniśmy zdać sobie sprawę, że możemy spojrzeć na nagłówki;) –

0

Aby zaakceptować odpowiedź JSON, można ustawić typ odpowiedzi jako JSON. Zwykle projektowałem mój kod po stronie serwera, więc zawsze zwracają odpowiedź JSON. W przypadku, gdy nie zrobi tego z jakiegokolwiek powodu, dostanę błąd w moim wywołaniu AJAX o niepoprawnym formacie JSON i mogę przetworzyć odpowiedź z serwera jako nie będącą JSON.

error: function(response, status, xhr){ 
// do something with the reply. 
} 
+0

Czy to nie zaśmieca procedury obsługi błędów? Moje jelit mówi, że jest hackish ... –

+0

off-course Mogę poprosić mojego serwera, aby zwrócił błąd logiczny sformatowany jako JSON, ale gdy serwer jest uszkodzony lub uszkodzony, nie dostaniesz ciała json. – Ivan

8

powyższych odpowiedzi nie działał na mnie tak wymyśliłem tego rozwiązania:

success: function(data, textStatus , xhr) { 
if(xhr.responseXML.contentType == "text/html") { 
    //do something with html 
    } 
else if(xhr.responseXML.contentType == "application/json") { 
    //do something with json 
    }} 
+0

Prawdopodobnie to nie zadziała, jeśli typem zawartości jest na przykład "text/html; charset = UTF-8" – Steven

14

można po prostu użyć łatwą metodę JavaScript w przeglądarce, by sprawdzić typ

tj

if(typeof response=="object") 
{ 
// Response is javascript object 
} 
else 
{ 
// Response is HTML 
} 

Jeśli użyjesz tej metody, nie musisz pisać 2 dodatkowych parametrów w oddzwanianiu powodzenia.

+0

To jest trochę hack, ale jest to najprostsze rozwiązanie. –

6

Jeśli odpowiedź zostanie przeanalizowana jako JSON, obiekt jqXHR będzie miał właściwość responseJSON.

$.ajax(
    // ... 
).done(function(data, textStatus, jqXHR) { 
    if (jqXHR.responseJSON) { 
     // handle JSON 
    } else { 
     // handle html 
    } 
}).fail(function(jqXHR, textStatus, errorThrown) { 
    if (jqXHR.responseJSON) { 
     // handle JSON 
    else { 
     // handle html 
    } 
}) 

Z jQuery.ajax documentation:

Jeśli json jest podana, odpowiedź jest analizowana z wykorzystaniem jQuery.parseJSON przed minął, jako obiekt, do obsługi sukces. Parsowany obiekt JSON jest udostępniany za pośrednictwem właściwości responseJSON obiektu jqXHR.

+0

To nie jest dokładne, ponieważ "nawodnienie" odpowiedzi zależy od formatu, o który prosiłeś. Przetestowałem wywołanie takie jak '$ .ajax ({.., dataType: 'html'})' i od strony serwera wysyłam odpowiedź 'application/json', ale jQuery nie wypełnia pola jqXHR.responseJSON. –

+0

Rzeczywiście, ale OP chciał znać typ odpowiedzi.Dlaczego podałeś 'dataType: 'html'', jeśli wiesz, że serwer nie wyśle' html '? Prawdopodobnie podanie 'dataType' zmusza jQuery do użycia tego typu danych, pomijając automatyczne wykrywanie. – tyrion

+0

Tak, prawdopodobnie, ale w moim przypadku, jeśli nie określę żądania 'html', symfony zwróci formularz w JSON, którego nie chcę. Sytuacje szczególne. –

Powiązane problemy