valor retornar funciona example ejemplos ejemplo como javascript ajax jquery http-status-code-404

javascript - funciona - retornar json php



¿Cómo devolver la llamada a una función en la solicitud 404 ajax JSON con jQuery? (10)

Quiero hacer una solicitud Ajax con respuesta en JSON. Así que hice esta solicitud de Ajax:

$.ajax({ url: ''http://my_url'', dataType: "json", success: function(data){ alert(''success''); }, error: function(data){ alert(''error''); }, complete: function(data) { alert(''complete'') }})

Este código funciona bien, pero cuando mi URL me envía un código HTTP 404, no se utilizan devoluciones de llamada, ni siquiera la devolución de llamada completa. Después de la investigación, es porque mi dataType es ''json'', por lo que 404 return es HTML y el análisis JSON falló. Así que no hay devolución de llamada.

¿Tiene una solución para llamar a una función de devolución de llamada cuando se genera un 404?

EDITAR: la devolución de llamada completa no devuelve la llamada es 404. Si desea una URL con 404 puede llamar: http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697 es con esto URL tengo mi problema.


¿Es simplemente porque el dataType está configurado a "json"? Si es así, intente cambiarlo a text y evalúe el JSON usted mismo:

$.ajax({ url: ''http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697'', dataType: ''text'', success: function(data, status, xmlHttp) { try { data = eval(''('' + data + '')''); alert(''success''); } catch (e) { alert(''json parse error''); } }, error: function(xmlHttp, status, error) { alert(''error''); }, complete: function(xmlHttp, status) { alert(''complete''); } });


¿No cree que el problema no está en el tipo de datos sino en las solicitudes de dominios cruzados que no puede realizar?

El código a continuación funciona como se esperaba cuando solicita datos del mismo dominio y no cuando se realizan solicitudes entre dominios:

function handle404(xhr){ alert(''404 not found''); } function handleError(xhr, status, exc) { // 0 for cross-domain requests in FF and security exception in IE alert(xhr.status); switch (xhr.status) { case 404: handle404(xhr); break; } } function dumbRequest() { var url = ''http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697''; url = ''http://twitter.com/''; url = ''/mydata.json''; // url = ''mydata.json''; $.ajax( {url: url, dataType: ''json'', error: handleError} ); }


¿Sabe que aunque el estado HTTP es 404, el cuerpo real es JSON válido? Por ejemplo, http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697 tiene el siguiente JSON:

jsonp1269278524295({"request":"/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697","error":"Not found"})

Como tal, debe verificar si sus datos tienen la propiedad de error dentro de su función normal de devolución de llamada.

ACTUALIZACIÓN : aparentemente, aunque el contenido real de la página es JSON válido, el navegador (lo verifiqué en Firefox) no lo está ejecutando, probablemente porque es un 404. Porque jQuery tiene que agregar un elemento de script (debido a la cruz) -problema de dominio), su envoltorio JSONP nunca se llama, y ​​como consecuencia, tampoco son sus devoluciones de llamada.

Entonces, en resumen, no creo que haya una manera de lidiar con esto sin agregar manualmente ese elemento de script y verificar si su función de devolución de llamada predefinida ha sido activada posteriormente.


Así es como trato con esto. Reviso los datos devueltos en busca de errores antes de intentar usarlos. Lo que se muestra a continuación es solo una muestra que podría ampliar para satisfacer mejor sus requisitos. Esto también considera tiempos de espera de sesión y otros escenarios ...

Mi llamada inicial:

$.ajax({ type: ''POST'', url: ''../doSomething'', data: ''my data'', success: function(data) { if (HasErrors(data)) return; var info = eval(''('' + data + '')''); // do what you want with the info object }, error: function(xmlHttpRequest) { ReportFailure(xmlHttpRequest); } });

Y las dos funciones auxiliares:

function HasErrors(data) { if (data.search(/login/.aspx/i) != -1) { // timed out and being redirected to login page! top.location.href = ''../login.aspx''; return true; } if (data.search(/Internal Server Error/) != -1) { ShowStatusFailed(''Server Error.''); return true; } if (data.search(/Error.aspx/) != -1) { // being redirected to site error reporting page... ShowStatusFailed(''Server Error. Please try again.''); return true; } return false; }

y

function ReportFailure(msg) { var text; if (typeof msg == ''string'') { text = msg; } else if (typeof msg.statusText == ''string'') { if (msg.status == 200) { text = msg.responseText; } else { text = ''('' + msg.status + '') '' + msg.statusText + '': ''; // use the Title from the error response if possible var matches = msg.responseText.match(//<title/>(.*?)/<//title/>/i); if (matches != null) { text = text + matches[1]; } else { text = text + msg.responseText; } } } // do something in your page to show the "text" error message $(''#statusDisplay'') .html(''<span class="ui-icon ui-icon-alert"></span>'' + text) .addClass(''StatusError''); }


Con su configuración, jQuery usa jsonp para transportar los datos. Esto funciona insertando dinámicamente un elemento de script y configurando la URL al valor especificado. Los datos devueltos por el servidor se evalúan como JavaScript, generalmente llamando a la devolución de llamada proporcionada. Si el servidor devuelve un 404, el contenido obviamente no es JavaScript y la devolución de llamada nunca se llama. Algunos navegadores admiten controladores de errores en la etiqueta de secuencia de comandos, que se llaman en estas situaciones. Desafortunadamente IE no soporta esto. La mejor manera de detectar un error es confiar en un tiempo de espera.

En su caso, debe especificar una opción de timeout adicional, que hace que se llame al manejador de errores si no se llamó a la devolución de llamada a tiempo (lo que sería el caso para una respuesta 404).

$.ajax({ url: ''http://my_url'', timeout: 2000, // 2 seconds timeout dataType: "json", success: function(data){ alert(''success''); }, error: function(data){ alert(''error''); }, complete: function(data) { alert(''complete'') } });


La siguiente solución está funcionando bien para mí :)

$.ajax({ url: ''http://my_url'', dataType: "json", success: function(data){ alert(''success''); }, error: function(data){ alert(''error''); },complete: function(xhr, data) { if(data==="parsererror"){ alert(''404''); } } });


Si desea manejar los errores al acceder a la API de Twitter con Javascript y jsonp, debe incluir el parámetro suppress_response_codes en su solicitud. Esto hace que todas las respuestas de la API de Twitter respondan con una respuesta 200 OK e incluyen un error. A continuación, debe comprobar si la respuesta incluye el parámetro de error o no.

$.ajax({ url: "https://api.twitter.com/1/users/show.json", dataType: ''jsonp'', jsonp: "callback", data: { screen_name: "simongate1337", suppress_response_codes: true // <- Important part }, success: function(data) { if(data.error) { console.log("ERROR: "+data.error); } else { console.log("Success, got user " + data.screen_name); } } });


Simplemente enfrentamos el mismo problema y vimos otra pregunta mencionada que jQuery-JSONP (jQuery Plugin) admite la captura de errores 404 o como lo describen: " recuperación de errores en caso de falla de la red o respuestas JSON mal formadas"

Y funciona perfecto :)

Aquí está mi código (simplificado) para obtener detalles sobre un video de YouTube a través de JSONP:

$.jsonp( { url: "https://gdata.youtube.com/feeds/api/videos/ee925OTFBCA", callbackParameter: "callback", data: { alt: "jsonc-in-script", v: "2" }, success: function(json, textStatus) { console.log("WEEEEEEEE!"); }, error: function(xOptions, textStatus) { console.error(arguments); } });


Usa el statusCode -Opción

$.ajax({ url: ''http://my_url'', dataType: "json", statusCode: { 404: function() { alert("I could not find the information you requested."); } }, success: function(data) { alert(''success''); }, error: function(data) { alert(''error''); }, complete: function(data) { alert(''complete''); } })


$.ajax({ url: ''http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697'', dataType: "json", success: function(data) { alert(''success''); }, error: function(data) { alert(''error''); }, complete: function(xhr, data) { if (xhr.status != 0) alert(''success''); else alert(''fail''); } })