técnica de desarrollo web para crear aplicaciones interactivas
AJAX
JavaScript Asíncrono y XML (AJAX) no es una tecnología por sí misma, es un término que describe un nuevo modo de utilizar conjuntamente varias tecnologías existentes. Esto incluye:HTML o XHTML, CSS, JavaScript, DOM, XML, XSLT, y el objeto XMLHttpRequest. Cuando estas tecnologías se combinan en un modelo AJAX, es posible lograr aplicaciones web capaces de actualizarse continuamente sin tener que volver a cargar la página completa. Esto crea aplicaciones más rápidas y con mejor respuesta a las acciones del usuario. from MDN
- La posibilidad de hacer peticiones al servidor sin tener que volver a cargar la página.
- La posibilidad de analizar y trabajar con documentos XML.
¿Que es un servidor HTTP?
servidor HTTP es un programa informático que procesa una aplicación del lado del servidor realizando conexiones bidireccionales y/o unidireccionales y síncronas o asíncronas con el cliente generando o cediendo una respuesta en cualquier lenguaje o Aplicación del lado del cliente. El código recibido por el cliente suele ser compilado y ejecutado por un navegador web. Para la transmisión de todos estos datos suele utilizarse algún protocolo. Generalmente se utiliza el protocolo HTTP para estas comunicaciones.
http://es.wikipedia.org/wiki/Servidor_web
Primer Paso – Cómo realizar una petición HTTP al servidor
Para realizar una petición HTTP usando Dart, es necesario crear una instancia de una clase que provea esta funcionalidad. Esta clase fue inicialmente introducida en Internet Explorer como un objeto ActiveX, llamado
XMLHTTP
. Después Mozilla, Safari y otros navegadores lo siguieron, implementando una clase XMLHttpRequest
que soportaba los métodos y las propiedades del objeto ActiveX original.
Para crear una instancia de la clase en Dart , es necesario poner:
//instancia de la clase XMLHttpRequest
XMLHttpRequest req = new XMLHttpRequest();
Algunas versiones de los navegadores Mozilla no funcionan correctamente si la respuesta del servidor no tiene la cabecera mime de tipo XML.
¿Que es una cabecera mime?
MIME es un estándar que clasifica los recursos y provee información (a los programas) acerca de cómo manejarlos. Esto permite la correcta manipulación e interpretación de diferentes tipos de archivos por parte de los programas (como navegadores). Por ejemplo, gracias a MIME, los navegadores pueden abrir correctamente un archivo ".txt" como un recurso de texto plano y no como un video u otro tipo.
Para solucionar esto vamos a usar un método extra que sobreescriba la cabecera enviada por el servidor, en caso que no sea
text/xml
.
//método extra que sobrescribe la cabecera enviada por el servidor, //en caso que no sea text/xml. req.overrideMimeType('text/xml');El próximo paso es decidir qué se hará después de recibir la respuesta del servidor a la petición enviada. A estas alturas sólo es necesario decirle al objeto HTTPrequest qué función de Dart se encargará de procesar la respuesta. Para esto se asigna la propiedad
onreadystatechange
del objeto al nombre de la función de Dart que se va a utilizar:
//función de Dart que se encargará de procesar la respuesta req.on.readyStateChange.add((e) { procesarRespuesta(); });
Hasta aquí no se ha especificado aun que pasara al recibir la respuesta esto se realizara mas adelante.Ahora lo que sigue es hacer la petición. Para esto se utilizan los métodos
open()
y send()
de la clase HTTPrequest.//Realizar peticion req.open("GET","https://graph.facebook.com/100001685098068", true); req.send(null);
- El primer parámetro de la llamada a
open()
es el método HTTP request – GET, POST, HEAD o cualquier otro método que se quiera usar y sea aceptado por el servidor. El nombre del método se escribe en mayúsculas, sino algunos navegadores (como Firefox) podrían no procesar la petición. Para más información sobre los métodos HTTP request visitar W3C specs - El segundo parámetro es el URL de la página que se esta pidiendo. Por medida de seguridad no es posible llamar páginas en dominios de terceras personas. Se debe saber el dominio exacto de todas las páginas o se obtendrá un error de 'permiso denegado' al llamar open(). Una falla común es acceder al sitio por domain.tld e intentar llamar las páginas como www.domain.tld.
En este ejemplo he usado como URL :
https://graph.facebook.com/100001685098068Facebook nos ha sorprendido con un cambio radical que vuelve a demostrar porque son la red social numero 1 del mundo. Se trata de una nueva API de integración: Facebook Open Graph, que ha cambiado totalmente la forma con la que podremos interactuar con Facebook a partir de ahora. Se trata de un cambio drástico, que no tiene nada que ver con como se trabajaba hasta ahora con Facebook y que viene a sustituir más que nada al ya instaurado aunque siempre incomodo Facebook Connect.Sin duda estamos a punto de ver como muchas nuevas web se lanzan a conectarse con Facebook ya que este ha pasado a dar soluciones a todos los niveles: desde los añadidos más básicos hasta complejas integraciones con las webs.Este cambio es básicamente un sistema mucho más intuitivo y fácil por el que Facebook pasa a trasmitir sus datos y por el que podemos enviárselos. La Graph API representa la información de Facebook de una forma organizada donde existen tipos de elementos con información que los compone (usuarios, posts, fotos, eventos, etc.) y conexiones entre todos ellos (amigos, feed, fotos y albumes, etc.). Facebook a adoptado el modelo de datos Json y ha pasado a generar las peticiones mediante URLs muy simples.para mas informacion acerca de la Grap API consulte documentación Graph APIEl tercer parámetro establece si la petición es asíncrona. Si se defineTRUE
, la ejecución de la función de JavaScript continuará aún cuando la respuesta del servidor no haya llegado. Por esta capacidad es la A en AJAX. - El tercer parámetro establece si la petición es asíncrona. Si se define
TRUE
, la ejecución de la función de Dart continuará aún cuando la respuesta del servidor no haya llegado. este es una capacidad de AJAX.
El parámetro en el método
send()
puede ser cualquier información que se quiera enviar al servidor si se usa POST para la petición. La información se debe enviar en forma de cadena, por ejemplo:name=value&anothername=othervalue&so=on
Si se quiere enviar información de esta forma, es necesario cambiar el tipo MIME de la petición usando la siguiente línea:
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
Segundo Paso – Procesando la respuesta del servidor
A continuación se implementara el metodo que procesa la respuesta del servidor. En primer lugar necesita revisar el estado de la petición. Si el estado tiene el valor 4, significa que la respuesta completa del servidor ha sido recibida y es posible continuar procesándola.
//Metodo que procesa la respuesta del servidor
void procesarRespuesta() {
//Estado de la peticion
if (req.readyState == 4) {
// todo va bien, respuesta recibida
}
else {
// aun no esta listo
}
}
La lista completa de valores para la propiedad
readyState
es:- 0 (no inicializada)
- 1 (leyendo)
- 2 (leido)
- 3 (interactiva)
- 4 (completo)
(Source)
if (req.status == 200) { // perfecto! } else { // hubo algún problema con la petición, // por ejemplo código de respuesta // 404 (Archivo no encontrado) // o 500 (Internal Server Error) }
Después de haber revisado el estado de la petición y el código de status de la respuesta, depende de uno hacer cualquier cosa con la información que el servidor ha entregado. Existen dos opciones para tener acceso a esa información:
req.responseText
– regresará la respuesta del servidor como una cadena de texto.req.responseXML
– regresará la respuesta del servidor como un objetoXMLDocument
que se puede recorrer usando las funciones de DOM
Tercer Paso – "¡Ahora todo junto!" - Un sencillo ejemplo
En este ejemplo se utilizará todo lo que se ha visto para hacer una petición HTTP. Se pedirá la información publica de un usuario de Facebook y después usaremos la función
alert()
con el contenido de la respuesta.#import('dart:html'); class EjemploAjax { XMLHttpRequest req; //Metodo constructor EjemploAjax() { } void getRecurso() { //Crear instancia de la clase XMLHttpRequest req = new XMLHttpRequest(); //método extra que sobrescribe la cabecera enviada por //el servidor en caso que no sea text/xml. req.overrideMimeType('text/xml'); //función de Dart que se encargará de procesar la respuesta req.on.readyStateChange.add((e) { procesarRespuesta(); }); //Realizar peticion req.open("GET","https://graph.facebook.com/emch91", true); req.send(null); } //Metodo que procesa la respuesta del servidor void procesarRespuesta() { //Estado de la peticion if (req.readyState == 4) { // todo va bien, respuesta recibida if (req.status == 200) { //mostrar resultado document.window.alert(req.responseText); } else { // hubo algún problema con la petición, // por ejemplo código de respuesta 404 (Archivo no encontrado) // o 500 (Internal Server Error) document.window.alert(req.responseText); //Mostrar error } } else { // aun no esta listo } } } //Metodo principal de la aplicacion void main() { EjemploAjax ejemplo = new EjemploAjax(); //llamar metodo que obtiene el recurso del servidor ejemplo.getRecurso(); }
Compilación y salida: