2011-03-17 11 views
6

Wdrażam aplikację, która polega na komunikacji między klientem JavaScript a serwerem, który wie, jak zareagować na klienta za pomocą notacji JSONP.Analizowanie odpowiedzi JSONP w języku JavaScript, gdy obecny jest kod błędu 4xx lub 5xx Http

Próbuję obsłużyć skrzynkę w moim kliencie JavaScript, gdzie mój serwer zwraca kod stanu http 4xx lub 5xx. Obecnie widzę, że skrypt nie jest oceniany, ponieważ przeglądarka uważa, że ​​jest to błąd (który jest.) Jednak nadal chcę przeczytać, co mój serwer ma do powiedzenia w przypadku odpowiedzi 4xx lub 5xx kod w moim kliencie JavaScript.

Widzę, że powoduje to błąd w elemencie znacznika script, ale obawiam się, że nie jest to przeglądarka internetowa i nie będzie solidnym rozwiązaniem.

Czy ktoś miał szczęście, wciąż analizując odpowiedź jsonp, mimo że kod stanu http to 4xx lub 5xx?

Zaczynam wierzyć, że powinienem użyć tego rozwiązania "ustaw czas oczekiwania", które "wykryje" awarię, stwierdzając, że funkcja zwrotna do żądania jsonp zakończy się w określonym przedziale czasowym, a jeśli nie , Wystąpił błąd.

EDYCJA: Tymczasowo zawsze zwracam kod stanu 200, gdy mój serwer wykrywa klienta jsonp, a następnie tuneluje komunikat o błędzie/status w zwróconym obiekcie json. Miałem nadzieję, że skorzystam z kodów statusu HTTP, ale myślę, że nie jest to możliwe dla klienta javscript.

Odpowiedz

7

Jednym ze sposobów użycia JSONP jest osadzenie informacji o stanie w wywołaniu zwrotnym. Więc podpis funkcja zwrotna będzie wyglądać

callback(result, status, message) 

więc jeśli wywołanie wygląda

http://myurl.com/?callback=fn 

generowania kodu dla pomyślnego połączenia, który wygląda jak

fn({"data":"my great data"}, 200) 

i wyjątkowej kondycji

fn(null, 500, "server error"} 
+0

Każdy pomysł na to, jak można to osiągnąć za pomocą projektu Lumen/Laravel? – jtanmay

-3

Możesz sprawdzić status obiektu XHR (jeśli nie korzystasz z biblioteki JS).

if(xhr.readyState == 4){ 
    if(xhr.status == 200){ 
    // good 
    }else if(xhr.status == 502){ 
    // d'oh 
    } 
} 

Jeśli używasz jQuery, można przekazać w statusCode obsłużyć szczególne przypadki dla $.ajax

+1

Jestem usin g JSONP, aby ominąć ograniczenia dotyczące domen. http://en.wikipedia.org/wiki/JSON#JSONP Rozdział 8.1 –

+1

@Macy Wygląda na to, że potrzebuję snu: p W każdym razie jest podobna dyskusja [tutaj] (http://stackoverflow.com/questions/1002367/jquery-ajax-jsonp-ignores-a-timeout-and-doesnt- zdarzenie o błędzie-błędzie). – Haochi

+0

fajne, dziękuję za ten link –

8

jsonp jest hack do pracy wokół kwestii między domenami. Kiedy to działa, działa dobrze. Ale jeśli nie, nie masz sposobu, aby dowiedzieć się, co poszło nie tak.

setTimeout to kolejny hack na oryginalnym. Jeśli musisz używać JSONP i nadal potrzebujesz wykrywania błędów (nie obsługujesz), to musisz zrobić. Nie ma lepszego rozwiązania.

Jeśli kontrolujesz serwer, spróbuj użyć alternatyw, takich jak Cross-Origin-Resource-Sharing (CORS) lub Crossdomain.xml Flasha, aby zezwolić na żądania między domenami. Jeśli nie kontrolujesz serwera, możesz za pośrednictwem serwera obsługiwać odpowiedzi, aby uzyskać lepszą kontrolę.

+0

Czy brak obsługi wielu przeglądarek dla CORS stanowi poważny problem w Twojej opinii? http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing –

+1

Jest to znaczący problem, ale podobnie jak wszystkie inne rozwiązania. CORS działa na większości nowych przeglądarek (w tym mobilnych safari), ale nie działa w starszych przeglądarkach. Flash jest uniwersalny na komputerze, ale nie działa na urządzeniach mobilnych. Serwer proxy po stronie serwera działa wszędzie, ale potrzebuje dodatkowej pracy. JSONP nie ma obsługi błędów. Wybierz mniejsze zło. –

Powiązane problemy