lunes, mayo 29, 2006

Traducción de Artículo de Ajax XVI

Conseguir datos seguros
Toda la documentación y especificaciones insiten en que solamente cuando el estado ready esta en 4 la información es segura para usar. Creeme, rara vez encontraras un caso donde la información no pueda ser obtenida de la propiedad responseText cuando el estado ready está en 3. Sin embargo, confiar en eso en tu aplicacion es una mala idea -- desde el momento que escribis código que dependa de información completa con estado ready en 3, está casi garantizado que llegará el momento en que la información sea incompleta.
Una mejor idea es proveer al usuario de alguna información cuando el estado ready este en 3, que una respuesta esta proxima. Mientras que usar una funcion como alert() es obviamente una mala idea --usar Ajax y luego bloquear al usuario con un cuadro de dialogo de alerta es muy poco razonable -- podes actualizar un campo en tu formulario o página mientras los estados ready cambian. Por ejemplo, trata de establecer el ancho de un indicador de progreso a un 25% para el estado ready en 1, 50% para el 2, 75% para el 3 y 100% (completo) cuando el estado ready llega a 4.
Por supuesto, como has visto, esta mejora es inteligente pero navegador-dependiente. En Opera, nunca obtendrás esos dos primeros estados ready y en Safari salta el primero (1). Por esa razón, dejo el codigo como este como ejercicio antes que incluirlo en el articulo.
Tiempo de echar un vistaso a los códigos de estado.
Una mirada mas cercana a los códigos de estado de HTTP
Con los estados READY y la respuesta del servidor en tu bolsa de técnicas de programación de Ajax, etas listo para agregar otro nivel de la sofisticación a tus aplicaciones Ajax --trabajar con códigos de estado del HTTP. Estos códigos son nada nuevo a Ajax. Han estado alrededor de la Web siempre que hubo Web. Ya has visto probablemente varios de éstos con tu navegador web:
  • 401: Sin autorizacion
  • 403: Prohibido
  • 404: No encontrado

Podes encontrar mas (Para una lista completa, ver Resources). Para agregar otra capa de control y sensibilidad (y particularmente un manejor de error más robusto) a tus aplicaciones Ajax, entonces necesitas comprobar los códigos de estado en una petición y responder apropiadamente.

  • 200: Todo está Bien
En muchas aplicaciones Ajax, vas a ver una funcion de rellamada que controla el estado ready y luego continuan trabajando con la información de la respuesta del servidor, como en el listing 6.
Listing 6. Funcion de rellamada que ignora el codigo de estado

function updatePage(){
if(request.readystate ==4){
var response = request.responseText.split("|");
document.getElementById("order").value = response[0];
document.getElementById("address").innerHTML = response[1].replace(/\n/g, "<br />");
}
}
Esto resulta ser una mejora miope y propensa a error en programacion Ajax. Si un script requiere autentificación y tu peticion no provee credenciales validas, el servidor va a devolver un código de error como el 403 o 401. Sin embargo, el estado ready va a estar establecido en 4 ya que el servidor respondió la petición (a pesar de que la respuesta no sea la que querias o esperabas para tu petición). Como resultado, el usuario no va a obtener información valida y hasta podría obtener un error feo cuando tu JavaScript trate de usar una unformación del servidor no existente.
Toma un esfuerzo minimo asegurarse que el servidor no solo haya terminado con una petición, sino que haya devuelto un código de estado "todo esta bien". Ese código es "200" y se reporta a traves de la propiedad status del objeto XMLHttpRequest. Para estar seguro de que no solo el servidor haya terminado con una petición sino que también reporte un estado ok, agrega un control adicional en tu función de rellamada como se muestra en el listing 7.

Listing 7. Controlar el código de estado válido

function updatePage(){
if (request.readyState ==4) {
if (request.status == 200){
var response = request.responseText.split("|");
document.getElementById("order").value = response[0];
document.getElementById("address").innerHTML = response[1].replace(/\n/g,"<br />");
} else
alert ("el estado es " + request.status);
}
}
Con la adición de algunas líneas del código, podes estar seguro de que si algo sale mal, tus usuarios van a obtener un (custionablemente) útil mensaje de error antes que ver una pagina con información mutilada sin explicación alguna.

Etiquetas: