Ver índice de contenidos del libro

Capítulo 11. Otras utilidades

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