Gestione degli errori di richiesta JSONP

Sto facendo una richiesta jsonp ajax, ma la gestione degli errori non funzionerà. Se la richiesta è 404 o 500, non gestirà l’errore.

Mi sono guardato intorno per trovare una risposta a questo, ma non riesco a trovare nulla. Sembra che ci sia una soluzione con http://code.google.com/p/jqueryjsonp/ , ma non riesco a trovare alcun esempio su come usarlo.

function authenticate(user, pass) { $.ajax ({ type: "POST", url: "url", dataType: 'jsonp', async: false, //json object to sent to the authentication url data: {"u": userid, "p": pass}, success: function (data) { //successful authentication here console.log(data); }, error: function(XHR, textStatus, errorThrown) { alert("error: " + textStatus); alert("error: " + errorThrown); } }) } 

Due modi per gestire l’errore,

  1. Non esiste una gestione degli errori per le richieste JSONP tra domini. Usa il plug-in jsonp disponibile su Github https://github.com/jaubourg/jquery-jsonp che fornisce supporto per la gestione degli errori.

  2. jQuery ajax Timeout – Timeout dopo un periodo di tempo ragionevole per triggersre la richiamata di errore perché potrebbe essere fallito in modo silenzioso. Non si può sapere quale sia l’errore effettivo (o lo stato di errore) ma almeno si arriva a gestire l’errore

Se controlli la documentazione di jQuery.ajax () , puoi trovare:

errore

Una funzione da chiamare se la richiesta non riesce (…) Nota : questo gestore non viene chiamato per lo script tra domini e le richieste JSONP tra domini. Questo è un evento Ajax.

Per questo motivo, sei costretto a trovare soluzioni alternative. È ansible specificare il timeout per triggersre una richiamata di errore. Significa che entro un periodo di tempo specificato la richiesta dovrebbe essere completata con successo. Altrimenti, supponi che abbia fallito:

 $.ajax({ ... timeout: 5000, // a lot of time for the request to be successfully completed ... error: function(x, t, m) { if(t==="timeout") { // something went wrong (handle it) } } }); 

Altri problemi nel codice …

Mentre JSONP (guarda qui e qui ) può essere usato per superare la restrizione dei criteri di origine, non puoi usare POST con JSONP (vedi CORS ) perché semplicemente non funziona in questo modo – crea un elemento per recuperare i dati, che deve essere fatto tramite la richiesta GET. La soluzione JSONP non utilizza l’object XmlHttpRequest, quindi non è una richiesta AJAX nel modo standard di comprensione, ma il contenuto è ancora accessibile dynamicmente – nessuna differenza per l’utente finale.

 $.ajax({ url: url, type: "GET" dataType: "jsonp", ... 

Secondo, fornisci dati in modo errato. Stai spingendo l’object javascript (creato usando i letterali degli oggetti) sul filo invece della sua rappresentazione JSON serializzata. Crea una stringa JSON (non manualmente, usa ad esempio il convertitore JSON.stringify ):

 $.ajax({ ... data: JSON.stringify({u: userid, p: pass}), ... 

Ultimo problema, hai impostato async su false , mentre la documentazione dice:

Richieste tra domini e dataType: le richieste “jsonp” non supportano l’operazione sincrona.

Ho lottato come te per un po ‘cercando di gestire gli errori sulle richieste DataJype di ajax jsonp, tuttavia voglio condividere il mio codice, spero che sia d’aiuto. Una cosa fondamentale è includere un timeout sulla richiesta Ajax, altrimenti non entrerà mai nell’errore: function

 $.ajax({ url: "google.com/api/doesnotexists", dataType: "jsonp", timeout: 5000, success: function (parsed_json) { console.log(parsed_json); }, error: function (parsedjson, textStatus, errorThrown) { console.log("parsedJson: " + JSON.stringify(parsedjson)); $('body').append( "parsedJson status: " + parsedjson.status + '' + "errorStatus: " + textStatus + '' + "errorThrown: " + errorThrown); } }); 

jsfiddle – Gestisce gli errori con jquery ajax call e JSONP dataType – Errore 404

Sto costruendo un fragile progetto JS che usa jquery-jsonp e ho sviluppato un approccio dual-jsonp / ajax che gestisce gli errori, indipendentemente dal metodo utilizzato.

 function authenticate(user, pass) { var ajax = ($.jsonp || $.ajax)({ 'url': /* your auth url */, 'data': { /* user, pass, ... */ }, 'contentType': "application/javascript", 'dataType': 'jsonp', 'callbackParameter': 'callback' // $.jsonp only; $.ajax uses 'jsonpCallback' }); ajax.done(function (data) { // your success events }); ajax.fail(function (jqXHR, textStatus, errorThrown) { // $.jsonp calls this func as function (jqXHR, textStatus) // and $.ajax calls this func with the given signature console.error('AJAX / JSONP ' + textStatus + ': ' + (errorThrown || jqXHR.url)); }); } 

Poiché jquery-jsonp e $ .ajax supportano la specifica di jQuery Deferred, possiamo unire insieme i due gestori di errori, gestire gli errori delle serie 400 e 500 e anche i timeout di ricerca.

Vecchia domanda ma ho avuto lo stesso problema. Ecco una soluzione che ha funzionato per me.

Se possiedi il dominio su cui hai scattato la tua richiesta, puoi impostare una variabile nella risposta e controllarla sul lato client.

Lato server:

 SERVER_RESPONSE=true; Callback(parameter1, parameter2); 

Dalla parte del cliente:

 if(typeof SERVER_RESPONSE === 'undefined'){ console.log('No Response, maybe server is down'); } else{ console.log('Got a server response'); }