2011-03-17 9 views
6

Sto implementando un'applicazione che si basa sulla comunicazione tra un client JavaScript e un server che sa come rispondere al client utilizzando la notazione JSONP.Analisi della risposta JSONP in Javascript quando è presente il codice di errore HTTP 4xx o 5xx

Sto tentando di gestire il caso nel mio client Javascript in cui il mio server restituisce con un codice di stato http di 4xx o 5xx. Attualmente quello che sto vedendo è che lo script non è valutato poiché il browser crede che sia un errore (che è). Tuttavia, voglio ancora leggere ciò che il mio server ha da dire in caso di questa risposta 4xx o 5xx codice nel mio client JavaScript.

Mi accorgo che questo genera un errore sull'elemento del tag script, ma sono preoccupato che non si tratti di un cross browser e che non sia una soluzione solida.

Qualcuno ha avuto fortuna nell'analizzare ancora una risposta jsonp anche se il codice di stato http è 4xx o 5xx?

Sto iniziando a credere che dovrei usare questa soluzione "imposta un timeout" che "rileva" un errore affermando che la funzione di callback alla richiesta jsonp sarebbe stata completata entro un certo periodo di tempo, e se non lo fosse , c'era un errore.

MODIFICA: restituisco temporaneamente 200 codice di stato quando il mio server rileva un client jsonp e quindi esegue il tunneling del messaggio di errore/stato dell'oggetto json restituito. Speravo di sfruttare i codici di stato HTTP, ma penso che sia un no-go per un client javscript.

risposta

7

Un approccio quando si utilizza JSONP consiste nell'incorporare le informazioni di stato nel callback. Quindi la firma funzione di callback sarebbe simile

callback(result, status, message) 

Quindi, se la chiamata sembra

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

generare il codice per una chiamata di successo che sembra

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

e per una condizione eccezionale

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

Qualche idea su come raggiungere questo obiettivo utilizzando il progetto Lumen/Laravel? – jtanmay

-3

È possibile controllare lo status dell'oggetto XHR (se non si sta utilizzando una libreria JS).

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

Se si utilizza jQuery, è possibile passare in un statusCode per gestire casi particolari per $.ajax

+1

Sto usin g JSONP per aggirare le restrizioni del dominio incrociato. http://en.wikipedia.org/wiki/JSON#JSONP Sezione 8.1 –

+1

@Macy Sembra che io abbia bisogno di dormire: p In ogni caso, c'è una discussione simile [qui] (http://stackoverflow.com/questions/1002367/jquery-ajax-jsonp-ignores-a-timeout-and-doesnt- fire-the-error-evento). – Haochi

+0

cool, grazie per questo link –

8

JSONP è un trucco per aggirare i problemi tra domini. Quando funziona, funziona bene. Ma quando non lo fai non hai modo di capire cosa è andato storto.

setTimeout è un altro hack in cima a quello originale. Se devi utilizzare JSONP e hai ancora bisogno di rilevamento degli errori (non gestione), questo è quello che dovresti fare. Non c'è una soluzione migliore.

Se si controlla il server, provare a utilizzare alternative come Cross-Origin-Resource-Sharing (CORS) o Flash's crossdomain.xml per consentire richieste tra domini diversi. Se non si controlla il server, è possibile eseguire il proxy della risposta tramite il server per ottenere un controllo migliore.

+0

La mancanza di supporto cross browser per CORS è un problema significativo secondo te? http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing –

+1

È un problema significativo, ma lo sono anche tutte le altre soluzioni. CORS funziona sulla maggior parte dei nuovi browser (incluso il safari mobile), ma non funziona sui browser più vecchi. Flash è universale sul desktop, ma non funziona sui dispositivi mobili. Il proxy sul lato server funziona ovunque, ma richiede un lavoro extra. JSONP non ha la gestione degli errori. Scegli il minore dei mali. –

Problemi correlati