11.1. Detener las peticiones HTTP erróneas
La creación de aplicaciones AJAX implica la aparición de nuevos tipos de errores y excepciones. Probablemente, el problema más importante sea el de realizar una petición al servidor y que este no responda en un periodo de tiempo razonable.
Aunque las peticiones se realizan de forma asíncrona y el usuario puede continuar utilizando la aplicación mientras se realiza la petición al servidor en un segundo plano, normalmente es necesario disponer de una respuesta rápida del servidor.
La función setTimeout()
se puede emplear para establecer una cuenta atrás al iniciar una nueva petición. Si el servidor responde antes de que expire la cuenta atrás, se elimina esa cuenta atrás y se continúa con la ejecución normal de la aplicación. Si el servidor no responde y la cuenta atrás finaliza, se ejecuta una función encargada de detener la petición, reintentarla, mostrar un mensaje al usuario, etc.
// Variable global que almacena el identificador de la cuenta atrás
var cuentaAtras = null;
var tiempoMaximo = 5000; // 5000 = 5 segundos
function cargaContenido(url, metodo, funcion) {
peticion_http = inicializa_xhr();
if(peticion_http) {
// Establecer la cuenta atrás al realizar la petición HTTP
cuentraAtras = setTimeout(expirada, tiempoMaximo);
peticion_http.onreadystatechange = funcion;
peticion_http.open(metodo, url, true);
peticion_http.send(null);
}
}
function muestraMensaje() {
...
if(peticion_http.readyState == READY_STATE_COMPLETE) {
if(peticion_http.status == 200) {
// Si se ha recibido la respuesta del servidor, eliminar la cuenta atrás
clearTimeout(cuentaAtras);
...
}
}
}
function expirada() {
// La cuentra atrás se ha cumplido, detener la petición HTTP pendiente
peticion_http.abort();
alert("Se ha producido un error en la comunicación con el servidor. Inténtalo un poco más adelante.");
}
Además de la falta de respuesta del servidor, las aplicaciones AJAX deben estar preparadas para otros tipos de respuestas que pueden generar los servidores. El tipo de respuesta se comprueba mediante el valor del atributo status
del objeto XMLHTTPRequest.
A continuación se muestran las tablas de los códigos de estado más comunes que pueden devolver los servidores:
Códigos de información
status | statusText | Explicación |
---|---|---|
100 |
Continue | Una parte de la petición (normalmente la primera) se ha recibido sin problemas y se puede enviar el resto de la petición |
101 |
Switching protocols | El servidor va a cambiar el protocolo con el que se envía la información de la respuesta. En la cabecera Upgrade indica el nuevo protocolo |
Códigos de petición y respuesta correctas
status | statusText | Explicación |
---|---|---|
200 |
OK | La petición se ha recibido correctamente y se está enviando la respuesta. Este código es con mucha diferencia el que mas devuelven los servidores |
201 |
Created | Se ha creado un nuevo recurso (por ejemplo una página web o un archivo) como parte de la respuesta |
202 |
Accepted | La petición se ha recibido correctamente y se va a responder, pero no de forma inmediata |
203 |
Non-Authoritative Information | La respuesta que se envía la ha generado un servidor externo. A efectos prácticos, es muy parecido al código 200 |
204 |
No Content | La petición se ha recibido de forma correcta pero no es necesaria una respuesta |
205 |
Reset Content | El servidor solicita al navegador que inicialice el documento desde el que se realizó la petición, como por ejemplo un formulario |
206 |
Partial Content | La respuesta contiene sólo la parte concreta del documento que se ha solicitado en la petición |
Códigos de redirección
status | statusText | Explicación |
---|---|---|
300 |
Multiple Choices | El contenido original ha cambiado de sitio y se devuelve una lista con varias direcciones alternativas en las que se puede encontrar el contenido |
301 |
Moved Permanently | El contenido original ha cambiado de sitio y el servidor devuelve la nueva URL del contenido. La próxima vez que solicite el contenido, el navegador utiliza la nueva URL |
302 |
Found | El contenido original ha cambiado de sitio de forma temporal. El servidor devuelve la nueva URL, pero el navegador debe seguir utilizando la URL original en las próximas peticiones |
303 |
See Other | El contenido solicitado se puede obtener en la URL alternativa devuelta por el servidor. Este código no implica que el contenido original ha cambiado de sitio |
304 |
Not Modified | Normalmente, el navegador guarda en su caché los contenidos accedidos frecuentemente. Cuando el navegador solicita esos contenidos, incluye la condición de que no hayan cambiado desde la última vez que los recibió. Si el contenido no ha cambiado, el servidor devuelve este código para indicar que la respuesta sería la misma que la última vez |
305 |
Use Proxy | El recurso solicitado sólo se puede obtener a través de un proxy, cuyos datos se incluyen en la respuesta |
307 |
Temporary Redirect | Se trata de un código muy similar al 302 , ya que indica que el recurso solicitado se encuentra de forma temporal en otra URL |
Códigos de error del navegador
status | statusText | Explicación |
---|---|---|
400 |
Bad Request | El servidor no entiende la petición porque no ha sido creada de forma correcta |
401 |
Unauthorized | El recurso solicitado requiere autorización previa |
402 |
Payment Required | Código reservado para su uso futuro |
403 |
Forbidden | No se puede acceder al recurso solicitado por falta de permisos o porque el usuario y contraseña indicados no son correctos |
404 |
Not Found | El recurso solicitado no se encuentra en la URL indicada. Se trata de uno de los códigos más utilizados y responsable de los típicos errores de Página no encontrada |
405 |
Method Not Allowed | El servidor no permite el uso del método utilizado por la petición, por ejemplo por utilizar el método GET cuando el servidor sólo permite el método POST |
406 |
Not Acceptable | El tipo de contenido solicitado por el navegador no se encuentra entre la lista de tipos de contenidos que admite, por lo que no se envía en la respuesta |
407 |
Proxy Authentication Required | Similar al código 401 , indica que el navegador debe obtener autorización del proxy antes de que se le pueda enviar el contenido solicitado |
408 |
Request Timeout | El navegador ha tardado demasiado tiempo en realizar la petición, por lo que el servidor la descarta |
409 |
Conflict | El navegador no puede procesar la petición, ya que implica realizar una operación no permitida (como por ejemplo crear, modificar o borrar un archivo) |
410 |
Gone | Similar al código 404 . Indica que el recurso solicitado ha cambiado para siempre su localización, pero no se proporciona su nueva URL |
411 |
Length Required | El servidor no procesa la petición porque no se ha indicado de forma explícita el tamaño del contenido de la petición |
412 |
Precondition Failed | No se cumple una de las condiciones bajo las que se realizó la petición |
413 |
Request Entity Too Large | La petición incluye más datos de los que el servidor es capaz de procesar. Normalmente este error se produce cuando se adjunta en la petición un archivo con un tamaño demasiado grande |
414 |
Request-URI Too Long | La URL de la petición es demasiado grande, como cuando se incluyen más de 512 bytes en una petición realizada con el método GET |
415 |
Unsupported Media Type | Al menos una parte de la petición incluye un formato que el servidor no es capaz procesar |
416 |
Requested Range Not Suitable | El trozo de documento solicitado no está disponible, como por ejemplo cuando se solicitan bytes que están por encima del tamaño total del contenido |
417 |
Expectation Failed | El servidor no puede procesar la petición porque al menos uno de los valores incluidos en la cabecera Expect no se pueden cumplir |
Códigos de error del servidor
status | statusText | Explicación |
---|---|---|
500 |
Internal Server Error | Se ha producido algún error en el servidor que impide procesar la petición |
501 |
Not Implemented | Procesar la respuesta requiere ciertas características no soportadas por el servidor |
502 |
Bad Gateway | El servidor está actuando de proxy entre el navegador y un servidor externo del que ha obtenido una respuesta no válida |
503 |
Service Unavailable | El servidor está sobrecargado de peticiones y no puede procesar la petición realizada |
504 |
Gateway Timeout | El servidor está actuando de proxy entre el navegador y un servidor externo que ha tardado demasiado tiempo en responder |
505 |
HTTP Version Not Supported | El servidor no es capaz de procesar la versión HTTP utilizada en la petición. La respuesta indica las versiones de HTTP que soporta el servidor |