AJAX (III): Funciones para obtener datos

Siguiendo con el post anterior sobre AJAX y una vez estudiado el objeto XMLHttpRequest vamos a definir algunas funciones que nos serán útiles para realizar cargas de datos en cualquier navegador.


Lo primero que necesitaremos siempre es obteneruna referencia a un objeto XMLHttpRequest. No se obtiene de la misma manera en Internet Explorer que en los demás navegadores, por lo que debemos tener en cuenta esas diferencias. En IE se obtiene a partir de un objeto ActiveX. En Firefox, Opera, Safari y compañía es una clase integrada del modelo de objetos del navegador. Sabiendo esto es fácil hacer una función genérica para obtener una referencia a un objeto XMLHttpRequest que funcione en todos los navegadores:



function getHttpRequest()
{
 var httpReq;
 //Si es Mozilla, Opera, etc…
 if (window.XMLHttpRequest)
 {
  httpReq = new XMLHttpRequest();
 }
 else //Internet Explorer lo expone como control Active X
 {
  httpReq = new ActiveXObject(«Microsoft.XMLHTTP»);
 }
}


Ahora que tenemos el objeto tenemos que usarlo para obtener una URL. Debemos usar sus métodos y propiedades (vistos en el anterior post) para conseguirlo:



http = getHttpRequest()
http.onreadystatechange = finCarga;
http.open(«GET», «http://www.miserv.com/misdatos.aspx», true)
http.send(null);


Es decir, obtenemos una referencia al objeto como hemos visto, establecemos la función a llamar cuando cambie el estado de la petición que vamos a hacer (más sobre esto luego). Indicamos que vamos a llamar (por GET) a una URL (segundo parámetro) de modo asíncrono (true en el tercer parámetro). Esto hará que se devuelva el control inmediatamente tras hacer la llamada.
Por fin debemos hacer la llamada (open no la hace sólo la prepara), usando para ello el método send. Se le pasa un nulo porque no enviamos ninguna información extra (es una petición GET).


Bien, una vez hecha la llamada, sólo nos queda definir la función que actuará cuando tengamos los datos (finCarga en nuestro ejemplo). Veámosla:



function finCarga()
{
 if (http.readyState == 4) //4: completado
 {
  if (http.status == 200) //200: OK
  {
   res = http.responseXML;
   Procesarespuesta();
  }
  else //Se produjo un error
  {
   alert(«No se pudo recuperar la información: » + http.statusText);
  }
 }
}


Como vemos se comprueba que el estado es el definitivo (terminado), que se ha obtenido correctamente la página (código de estado 200), y se guarda en una variable (global) el XML obtenido (podría haber sido el texto obtenido con responseText). La función ProcesaRespuesta() se encargará de, a partir del XML realizar el trabajo que corresponda.


Para trabajar con el XML usaremos el DOM. No voy a entrar en detalle en este tema ya que cualquiera que haya trabajado con HTML dinámico sabe usarlo más o menos. De todos modos puedes consultar la referencia del DOM para JavaScript que tiene el W3C o si lo prefieres la de Firefox/Mozilla. Generalmente nos va a ser suficiente con usar dos o tres métodos del DOM. Los más importantes sin duda son getElementsByTagName y getElementByID que sirven para localizar elementos en el XML del mismo modo que se hace para hacerlo en HTML común.


EJEMPLO PRÁCTICO:


Para rematar este tema (me hubiera gustado pararme más pero estos días no he tenido tiempo) os dejo un archivo ZIP con un ejemplo sencillo pero completo.


Se trata de un par de listas desplegables. La primera de ellas contiene una serie de elementos (empresas, blogs, revistas, libros…) que el usuario puede elegir. La segunda lista se rellena dinámicamente en segundo plano a partir de la selección hecha en la primera. Lo he colocado en mi servidor para que puedas probarlo directamente on-line pulsando sobre la siguiente figura:



Pulsa sobre la imagen para probarlo


Nota: Sí, antes de que me lo preguntes: el navegador de la imagen es Internet Explorer 7 en castellano) 😉


Para rellenar la segunda lista se llama por detrás, usando AJAX, a una página ASP que en función del parámetro facilitado devuelve la lista apropiada. El ASP lo tienes en el archivo ZIP de descarga. No se conecta a una base de datos ni nada similar para simplificar (en la realidad seguramente sería así) pero te servirá para hacerte una idea.


CONCLUSIÓN:


Una vez sentadas las bases de AJAX «a pelo», y estudiado un ejemplo práctico completo  (que te puedes descargar) me tomaré unos días de vacaciones del Blog 🙂


Dentro de unos días y para rematar con esta serie comentaré algunas cuestiones peliagudas referentes al uso de AJAX, y veremos problemas típicos y sus soluciones en este tipo de aplicaciones. A partir de ahora es cosa tuya cómo lo apliques.


Si alguien quiere que me deje un comentario aquí y podemos tratar también el tema de los Script Callbacks de ASP .NET 2.0, que están íntimamente relacionados con técnicas AJAX pero hacen que sea más fácil que todo esto.

AJAX (II): El objeto XMLHttpRequest

Lo prometido es deuda y hoy seguimos (o casi empezamos) con el estudio de las aplicaciones AJAX.


Aparte de saber HTML y JavaScript, el primer objeto que debemos conocer para hacer aplicaciones AJAX es XMLHttpRequest.


Si has utilizado alguna vez las bibliotecas MSXML con Visual Basic 6.0 o ASP 3.0 es probable que ya lo conozcas. Aunque en el caso de Internet Explorer se sigue usando este objeto ActiveX en el resto de los navegadores (Firefox, Opera, Safari…)  este objeto forma parte ya de las clases nativas del navegador.


Su utilidad básica es la de enviar peticiones (tanto GET como POST) a Urls mediante el protocolo HTTP.


Los métodos y propiedades básicos que debemos conocer son los siguientes(los corchetes indican parámetros opcionales):




  • open(metodo, URL, [asincrono], [usuario], [clave]): sirve para abrir una conexión al servidor. No envía ni obtiene información, sólo se conecta. El tercer parámetro es booleano y sirve para indicar si la conexión se realizará asíncronamente o no (normalmente será que sí). Se puede especificar un nombre de usuario y una contraseña de accesopero normalmente esto será absurdo (estará en claro en el JavaScript, ya me dirás de qué sirve entonces).


  • send(contenido): envía una petición. Si es un POST se pueden incluir los datos a enviar en el parámetro, si no se usa un nulo.


  • abort(): cancela un envío/petición.


  • onreadystatechange: se le asigna un método que será llamado automáticamente cuando se descargue de todo la URL remota (cuando se llama asíncronamente).


  • readyState: informa del estado de la petición: 0=no iniciada, 1=cargando, 2=terminada pero sin procesar, 4=completada.


  • status: código de estado HTTP: por ejemplo 200 (éxito), 404 (no encontrado), etc…


  • statusText: mensaje de información del estado anterior.


  • responseXML: documento DOM que representa el XML devuelto por la petición (se espera XML, claro). Más sobre este asunto en la próxima entrega.


  • responseText: el contenido puramente textual del recurso remoto. Útil si no nos devuelve XML.

Hay algunas cosas más pero con estas es más que suficiente para el 99% de los casos.


Vale por el momento. Quédate con esta idea. En la próxima entrega vamos a ver el uso en la práctica de este objeto. Haremos una función genérica que nos sirva para obtener cualquier URL remota y que funcione tanto en Internet Explorer como en los demás navegadores del mercado.


¡Permanece atento!

La palabra de moda: AJAX – ¡hagamos un ejemplo!

Si hay una palabra de moda últimamente en el mundillo (o submundo, que también vale) de la programación Web esta es sin duda AJAX. Se trata de un acrónimo que significa Asynchronous JavaScript And XML y sienta las bases de las nuevas aplicaciones dinámicas que no recargan la página, como por ejemplo GMail o MSN Earth (ahora Local Live) entre otras muchas.


Se basa en el uso de un objeto llamado XMLHttpRequest que como puedes imaginar sirve para hacer peticiones de documentos XML a través del protocolo HTTP y que apareció por primera vez en las bibliotecas XML de Microsoft (MSXML). Con este objeto se piden documentos XML que luego es posible manipular mediante código JavaScript desde dentro de una página y mostrar resultados dentro de capas (div) de la misma. Esto es lo básico pero da mucho de sí .


Aunque ahora parece que los chicos de Google han inventado la pólvora lo cierto es que el concepto original de esta tecnología fué creado por Microsoft (se llamaba Remote Scripting y he de confesar que a mi no me gustaba mucho en su día), el primer navegador en soportarlo fue, claro está, Internet Explorer y la primera aplicación de este tipo fué Outlook Web Access, para acceder a buzones Exchange.


Bien, sentados los antecedentes de la tecnología vamos a ver en unos cuantos «post» próximos cómo funciona AJAX y desarrollaremos un ejemplo práctico con ella que funcione no sólo en IE, sino en todos los navegadores.


Aunque ahora existen ya algunas bibliotecas de funciones especiales para AJAX en diversas plataformas de desarrollo nosotros, que somos unos machotes, vamos a hacerlo a pelo, es decir sólo con lo que trae el navegador y así aprenderemos bien el funcionamiento.


Por cierto en .NET la biblioteca AJAX más conocida es AJAX .NET. La verdad es que está muy bien pero se quedará en nada cuando aparezca el año que viene (se supone) la biblioteca AJAX de Microsoft llamada con el nombre clave Atlas. Yo ya he trabajado un poco con ella y he visto ejemplos más grandes en funcionamiento y os puedo asegurar que es una verdadera virguería: con soporte para espacios de nombres, herencia, servicios Web, controles ASP.NET, y muchas cosas que facilitan el trabajo. En la parte de cliente parece que estás trabajando en C# en lugar de en JavaScript. Lo malo que tiene es que las betas actuales apestan: muy mala documentación y además desfasada respecto a las biblitoecas, los ejemplos no funcionan, etc.. A ver si sacan una beta de verdad (esto son más bien alfas). Por cierto si has probado la beta de Microsoft Live (te lo recomiendo) puedes comprobar que los módulos que se «enganchan» al sistema usan por debajo Atlas. Si alguien está interesado que me lo diga y podemos hacer una mini-serie de «post» explicando cómo se crean estos módulos de «Live».


En fin, lo dicho, tras haber presentado AJAX mañana y los próximos días vamos a currarnos un ejemplo completo desde cero para ver cómo trabaja el asunto. ¡Mantente sintonizado a este blog!