viernes, marzo 17, 2006

Traducción de Artículo de Ajax IX

Un acertijo sobre asincronicidad
En un último artículo de esta serie, voy a tomarme un buen tiempo para escribir y usar código asincronico, pero deberías tener una idea de por que el último parametro en open() es tan importante. En un modelo normal de petición/respuesta -pensa en la Web 1.0 acá- el cliente (tu navegador o el código ejecutandose en tu maquina local) hace una petición al servidor. Esa petición es sincrónica, en otras palabras, el cliente espera por la respuesta del servidor. Mientras el clientes está esperando, normalmente ves una de las fomas de notificacion de que está esperando:
  • un reloj de arena (especialmente en windows)
  • Una pelota de playa giratoria (normalmente en máquinas Mac)
  • La aplicación se congela y a veces el cursor cambia.
Esto es lo que hace que las aplicaciones web en particular se sientan pesadas y lentas -- la ausencia de interactividad real. Cuando apretas un boton, tu aplicación se vuelve inutilisable hasta que la peticion que enviaste sea respondida. Si haces una peticion que requiera un importante procesamientos del servidor, la espera puede ser significativa (al menos para los multiprocesadores, DSL , mundo sin espera de hoy).
Una petición asincrónica sin embargo, no espera a que el servidor responda. Mandas la petición y luego tu aplicación continúa. Los usuarios pueden cargar información al formalario todavía, presionar otros botones, y hasta dejar el formulario. No hay pelota de playa giratoria o reloj de arena girando y no hay grandes congelamientos de la aplicacion. El servidor responde silenciosamente y cuando termina, le hace saber al solicitante original que ya está hecho (de maneras que verás en un momento). El resultado final es una aplicacion que no se siente pesada o lenta, al contrario es dinámica, interactiva y se siente mas rápida. Este es solo un componente de la Web 2.0, pero es muy importante. Todos los los componentes GUI pulidos y los paradigmas del diseño web no pueden superar un lento, sincrónico modelo de petición/respuesta.
Enviar la petición
Una vez configurada la peticion con open(), estás listo para enviarla. Afortunadamente el metodo para enviar una petición se llama de forma mas apropiada que open(); es llamado simplemente send().
send() tiene un solo parámetro, el contenido a enviar. Pero antes que penses mucho en eso, recuarda que estás listo para mandar informacion a traves de la URL misma:
var= url="/cgi-local/lookupcustomer.php?phone="+escape(phone);
Aunque podés mandar información usando send(), tambien podes mandarla a traves dela URL misma. De hecho, en las peticiones GET (que van a constituir tanto como el 80% de tu uso tipico de Ajax), es mucho mas facil mandar la informacion en la URL. Cuando empezas a mandar información segura o XML, es cuando queres ver como se manda contenido mediante send() (voy a hablar de ambos, informacion segura y envio de XML en uno de los ultimo sarticulos de esta serie). Cuando no necesitas pasar informacion atraves de send(), pasa null como argumento de este metodo. Entonces, para mandar una petición en el ejemplo que has visto en este artículo, eso es exactamente lo que se necesita. (ver listing10)

listing 10: enviar la peticion

function getCustomerInfo(){
var phone = document.getElementById("phone").value;
var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);
request.open("GET", url, true);
request.send(null);
}

Etiquetas:

lunes, marzo 13, 2006

Traducción de Artículo de AJAX VIII

Enviar peticiones con XMLHttpRequest
Una vez que tenés tu objeto de petición, podés empezar el ciclo petición/respuesta. Recuerda, el único proposito de XMLHttpRequest es permitirtehacer peticiones y recibir respuestas. Todo lo demás -cambiar la interfaz del usuario, intercambio de imagenes, interpretar la información devuelta por el servidor- es trabajo de Javascript, CSS u otro código en tus paginas. Con XMLHttpRequest listo para usar, podes hacer una petición al servidor.
Bienvenido al cajón de arena1
Ajax tiene un modelo de seguridad sandbox. Como resultado, tu código Ajax (y especificamente, el objeto XMLHttpRequest) solamente puede hacer peticiones en el servidor en el cual esta ejecutandose. Vas a aprender mucho más sobre seguridad y Ajax en un artículo próximo, pero por ahora tené en cuenta que el código ejecutandose en tu máquina local solo puede hacer peticiones al los scripts del lado servidor en tu máquina local. Si tenés código Ajax ejecutandose en www.breakneckpizza.com, deberá hacer peticiones a los scripts que se ejecutan en www.breackneckpizza.com.
Establecer la URL del servidor
La primera cosa que necesitas determinar el la URL para conectarse con el servidor. Esto no es especifico de Ajax -obviamente ya tenes que saber como contruir una URL- pero es esencial para hacer una conexión. En la mayoria de las aplicacione, contruirias la URL con algo de información estática convinada con información del formulario con el que trabajan tus usuarios. Por ejemplo, el listing 7 muestrs algo de JavaScript que toma el valor del campo del número de teléfono y luego construye una URL usando esa información.
Listing 7. Construir una URL de petición

<script language="javascript" type="text/javascript">
var request = false;
try {
request = new XMLHttpRequest();
} catch (trymicrosoft){
try {
request=new ActiveXObject("Msxml2.XMLHTTP");
} catch(othermicrosoft) {
try {
request= new ActivexObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request)
alert("Error al inicializar XMLHttpRequest!");

function getCustomerInfo(){
var phone = document.getElementById("phone").value;
var url = "cgi-local/lookupCustomer.php?phone=" + escape(phone);
}
</script>
Nada de esto debería confundirte. Primero, el código crea una nueva variable llamada phone y le asigna el valor del campo del formulario con el id igual a phone. El listing 8 muestra el XHTML para este formulario en particular donde podés ver el campo phone y su atributo id.

Listing 8. El formulario de Break Neck Pizza

<body>
<p><img src="breakneck-logo_4c.gif" alt = "Breack Neck Pizza" /></p>
<form action ="POST">
<p>
<input type = "text" size="14" name="phone" id="phone" onChange="getCustomerInfo();" />
</p>
<p>YOur order will be delivered to:</p>
<div id="address"></div>
<p>Type your order here</p>
<p><textarea name="order" rows="6" cols="50" id="order"></textarea></p>
<p><input type = "submit" value "Order Pizza" id="submit"/></p>
</form>
</body>
Tambien fijense que cuando el usuario ingresa su número de teléfono o lo cambia, dispara el método getCustomerInfo() mostrado en el listing 7. Ese método toma el numero y lo usa para construir una cadena URL, guardada en la variable URL. Recuerda, dado que el codigo Ajax tiene caja de arena y solo se puede conectar con el mismo servidor, no necesitarías el nombre deldominio en tu URL. En este ejemplo, el nombre del script es /cgi-local/lookupCustomer.php. Finalemnte, el número de teléfono es asociado a este script como un parámetro GET: "phone="+escape(phone).
Si no habías visto antes el método escape() , se usa para deschar todo caracter que no pueda ser enviado correctamente como texto. Por ejemplo, cualquier especio en el nuemro de telefono es convertido a los caracteres %20, haciendo posible el pasaje de los caracteres a traves de la URL.
Podes agregar tantos parametros como necesites. Por ejemplo, si queres agregar otro parametro, solo asocialo en la URL y separa los parametroscon el caracter ampersans & (el primer parametro es separado del nombre del script con un signo de pregunta ?)
Abriendo la petición
Con una URL para conectarse, podés configurar la petición. Lo logras usando el método open() de tu objeto XMLHttpRequest. Este método tiene tantos como 5 parámetros:
  • request-type: el tipo de petición a enviar. los valores tipicos son GET o POST, pero tambien podes mandar peticiones HEAD
  • url: LaURL para contectarse
  • asynch: Verdadero (true) que la petición sea asincrónica y falso (false) si tiene que ser una peticion sincrónica. Este parametro es opcional y por defecto es verdadero.
  • username: si se requiere autenticacion, podes especificar el nombre de usuario acá. Es un parametro opcional y no tiene valor por defecto.
  • password: si se requiere autenticacion, podes especificar la contraseña acá. Es un parametro opcional y no tiene valor por defecto.
Tipicamenter, vas a usar en primero de los tres. De hecho, hasta cuando quieras una peticion asincronica, deberías espesificar verdadero como tercer parametro. Ese es el valor por defecto , pero es un buen poco de auto-documentación para indicar si la peticion es asincronica o no.
Ponelo todo junto y normalemnte terminar con una linea que se ve como el listing 9:
Listing 9. Abrir la peticion
function getCustomerInfo(){
var phone = document.getElementById("phone").value;
var url = "cgi-local/lookupCustomer.php?phone=" + escape(phone);
request.open("GET", url, true);
}
Una vez que tenes la URL resulta, esto es bastante simple. Para la mayoria de las peticiones, usar GET es suficiciente (vas a ver situaciones en las cuales usarías post en articulos futuros); esto, junto con la URL, es todo lo que necesitas para usar open().



1. sandbox

Etiquetas:

martes, marzo 07, 2006

Traducción de artículo de Ajax VII

Estático versus dinámico
Fijate en los Listing 1, 3 y 4 y observá que todo el código está anidado directamente entre etiquetas script. Cuando JavaScript es codificado así y no puesto dentro un método o en el cuerpo de una función, se llama JavaScript estático. Esto significa que el código se ejecuta a veces antes que la página se muestre al usuario (no es 100% claro desde la especificación precisamente de cuando este código se ejecuta y los navegadores hacen diferentes las cosas; igual te garantiza que el código se ejecuta antes que los usuarios puedan interactuar con tu página). Es como generalmente la mayoría de los programadores de Ajax crean el objeto XMLHttpRequest.
Dicho esto, indudablemente podés poner este código en un método como se muestra en el listing 5
Listing 5. Mover el código de creación XMLHttpRequest dentro de un método

<script language="javascript" type="text/javascript">
var request;
function createRequest () {
try {
request = new XMLHttpRequest();
} catch (trymicrosoft){
try {
request=new ActiveXObject("Msxml2.XMLHTTP");
} catch(othermicrosoft) {
try {
request= new ActivexObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request)
alert("Error al inicializar XMLHttpRequest!");
}
</script>

Con el código dispuesto como este, vas a necesitar llamar el método antes de que hagas algun trabajo Ajax. Entonces deberías tener algo como el listing 6
Listing 6. Usar un método de creación de XMLHttpRequest

<script language="javascript" type="text/javascript">
var request;
function createRequest () {
try {
request = new XMLHttpRequest();
} catch (trymicrosoft){
try {
request=new ActiveXObject("Msxml2.XMLHTTP");
} catch(othermicrosoft) {
try {
request= new ActivexObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request)
alert("Error al inicializar XMLHttpRequest!");
}
function getCustomerInfo();
</script>


El único tema con este código - y la razón por la cual la mayorías de los programadores de Ajax no usan esta forma- es que retarda la notificación de error. Supongamos que tenés un formulario complejo con 10 o 15 campos, cajas de selección y similares, y disparas algo de código Ajax cuando el usuario ingresa texto en el campo 14 (al final del formulario). A ese punto, getCustomerInfo() se ejecuta, trata de crear un objeto XMLHttpRequest y (para este ejemplo) falla. Entonces se escupe un alerta al usuario, diciéndole (en varias palabras) que no puede usar esta aplicación Pero el usuario ya gastó su tiempo ingresando información en el formulario! Eso es bastante molesto y molestia no es algo que típicamente atraiga a los usuarios a volver a tu sitio.
En el caso donde usas JavaScript estático, el usuario va a ver un error apenas entre a la página. ¿eso es molesto tambien? Probablemente; puede hacer que los usuarios se enojen por que tu aplicacion no funciones en sus navegadores. Sin embargo, indudablemente es mejor que tirarle el mismo error despues de que se gastó 10 minutos ingresando información. Por esa sola razón, te propongo establecer tu códgo estaticamente e informarles a los usuarios de forma tamprana sobre posibles problemas.

Etiquetas:

Traducción de artículo sobre Ajax VI

Introducción al XMLHttpRequest
Para hacer que esta maravilla suceda, necesitás familiarizarte íntimamente con un objeto JavaScript llamado XMLHttpRequest. Este pequeño objeto -que realmente ha estado en varios navegadores hace bastante tiempo- es la clave de Web 2.0, Ajax y casi todo lo demás que vas a aprender en esta columa por lo próximos meses. Para darte una rápida vista, estos son solo algunos de los métodos y propiedades que vas a usar en este objeto:
  • open(): establecer una nueva petición a un servidor
  • send(): enviar una petición al servidor
  • abort(): Escapar de la petición actual
  • readystate: provee el estado correcto del HTML actual
  • responseText: El texto que el servidor devuelve al responder una petición.
No te preocupes si no las entendés todas (o algunas para el caso) vas a aprender sobre cada método y propiedad en próximos artículos. Lo que deberías sacar de esto es una buena idea de que hacer con XMLHttpRequest. Observa que cada uno de esos métodos y propiedades se relacionan con mandar una petición y tratar con la respuesta. De hecho, si mirás cada método y propiedad de XMLHttpRequest, estarán todas relacionadas a ese tan simple modelo petición/respuesta. Por eso claramente, no vas a aprender sobre un sorprendente objeto GUI nuevo o alguna clase de avance super secreto para crear interacción con el usuario; vas a trabajar con simples peticiones y simples respuestas. Puede ser que no suene exitante, pero el uso cuidadoso de este objeto puede cambiar totalmente tus aplicaciones.
La simplicicidad de lo nuevo
Primero, necesitás crear una nueva variable y asignarle una instancia del objeto XMLHttpRequest. Eso es bastante simple en JavaScript; solo usa la nueva palabra clave con el nombre del objeto, como ves en el linsting 1
Listing 1. Crear un nuevo objeto XMLHttpRequest
<script language="javascript" Type="text/javascript">
var request= new XMLHttpRequest();
</script>
No es tan difícil, ¿no?. Recuerda, JavaScript no requiere que ingreses algo en sus variables, por eso no necesitas nada como lo que ven en Listing 2 (que sería como deberías crear este objeto en Java)
Listing 2. Crear un nuevo objeto XMLHttpRequest
XMLHttpRequest request= new XMLHttpRequest();
Entonces creaste la variable en Javascript con var, dandole un nombre (como "request") y despues le asignaste una nueva instancia de XMLHttpRequest. En esete punto, ya estas listo para usar el objeto en sus funciones.
Manejo de error
En la vida real, las cosas puede ir mal y este código no provee ningún manejo de error. Una pequeña mejora es crear este objeto y tener una salida elegante si algo sale mal. Por ejemplo, muchos navegadores viejos (aunque no lo creas, la gente todavía sigue usando versiones viejas de Netscape Navigator) no soportan XMLHttpRequest y necesitás hacerles saber que algo anda mal. El listing 3 muestra como deberías crear este objeto para que si algo falla, tire una alerta de JavaScript.
Listing 3. Crear XMLHttpRequest con algunas habilidades de tratamiento de error
<script language="javascript" type="text/javascript">
var request = false;
try {
request = new XMLHttpRequest();
} catch (failed) {
request = false;
}
if (!request)
alert("Error al inicializar XMLHttpRequest!");
</script>
Asegurate de entender cada uno de estos pasos:
  1. Crear una nueva variable llamada request y asignarle un valor falso (false). Vas a usar falso como condición que signifique que el objeto XMLHttpRequest no haya sido creado todavía.
  2. Agregarlo en un bloque try/catch
    1. tratar y crear el objeto XMLHttpRequest
    2. Si eso falla (catch(failed)), asegurate que request todavía sea falso.
  3. Control si request es falso (si las cosas salen bien no lo será)
  4. Si hubo un problema (y request es falso), usa un alerta JavaScript para decirle al usuario que hubo un problema.
Es bastante simple; es mas largo de leer y escribir, que de entender para la mayoría de los desarrolladores JavaScript y Web. Ahora tenes una piesa de código a prueba de error que crea un objeto XMLHttpRequest y hasta te avisa si algo sale mal.
Lidiar con Microsoft
Todo esto se ve bastante bien... por lomenos hasta que pruebes tu código en Internet Explorer. Si lo haces, vas a obtener algo tan feo como en la figura 1:
figura 1: Internet Explorer reportando un error.


Claramente, algo no está funcionando. Internet Explorer es duramente un navegador desactualizado y alrededor del 70% del mundo lo usa. En otras palabras, no harías bien en el mundo Web si no soportaras Microsoft e Internet Explorer! Por eso, necesitas una mejora diferente para lidiar con navegadores Microsoft.
Resulta que Microsoft soporta Ajax, pero llaman a su versión de XMLHttpRequest algo diferente. De hecho lo llaman de diferentes formas. Si estás usando una version nueva de IE, necesitas usar un objeto llamado Msxml2.XMLHTTP; algunas versiones mas viejas usan Microsoft.XMLHTTP. Necesitas soportar esos dos tipos de objetos (sin perder el soporte que ya tenes para los navegadores no-Microsoft). Revisa el listing 4 que agrega soporte para Microsoft al código que ya habías visto.
Listing 4. Agregar soporte para los navegadores Microsoft
<script language="javascript" type="text/javascript">
var request = false;
try {
request = new XMLHttpRequest();
} catch (trymicrosoft){
try {
request=new ActiveXObject("Msxml2.XMLHTTP");
} catch(othermicrosoft {
try {
request= new ActivexObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request)
alert("Error al inicializar XMLHttpRequest!");
</script>

Es fácil perderse en estos vericuetos, por eso los guio a traves de ellos un paso por vez:
  1. Crear una nueva variable llamada request y asignarle un valor falso (false). Usar el valor falso como condición para indicarque el objeto XMLHttpRequest no ha sido creado todavía.
  2. Agregar el bloque try/catch
    1. Probar y crear un objeto XMLHttpRequest
    2. Si falla (catch(trymicrosoft))
    3. Probar y crear un objeto compatible con Microsoft usando las más nuevas versiones de Microsoft (Msxml2.XMLHTTP)
    4. Si falla (catch(othermicrosoft)), probar y crear un objeto compatible con Microsoft usando la version mas vieja de Microsoft (Microsoft.XMLHTTP)
    5. Si aún falla, asegurate de que request siga establecida en falso
  3. Verifica si request es todavia falso (si las cosa están bien, no será)
  4. Si hay un problema (y request es falso), usa un alerta de Javascript para avisarles a los usuarios que hay un problema.
Has esos cambios a tu código y prueba las cosas en IE otra vez; deberías ver el formularioque creaste (sin mensaje de error). En mi caso, resulto algo como en la figura 2.
Figura 2: Internet Explorer trabajando normalmente

Etiquetas:

viernes, marzo 03, 2006

Traducción del articulo de Ajax V

Bueno, para seguir con esto, vamos por la Parte II del asunto:

Dominar AJAX, Parte 2: Hacer peticiones asincrónicas con Javascript y Ajax
Usar XMLHttpRequest para peticiones Web
Nivel: Intermedio
Brett McLaughlin (brett@oreilly.com), Autor y Editor, O´Reilly y Asociados.
17 Ene 2006
La mayoría de las aplicaciones Web usan un modelo pedido/respuesta que toma una página HTML entera desde el servidor. El resultado es un ida y vuelta que generalmente involucra presionar el botón, esperar al servido, presionar otro botón y esperar un poco más. Con Ajax y el objeto XMLHttpRequestpodés usar un modelo de pedido/respuestaque nunca deja a los usuarios esperando a que un servidor les responda. en este artículo, Brett McLaughlin te muestra como crear instancias XMLHttpRequesten una forma multi-navegador , construir y enviar peticiones y respuestas al servidor.

En el último artículo de esta serie (ver en recursos por links), fuiste introducido a las aplicaciones Ajax y viste algo de los conceptos básicos que manejan las aplicaciones Ajax. En el centro de esto había un monton de tecnología que problablemente ya conocias: JavaScript, HTML and XHTML, un poco de HTML dinámico y tambien un poco de DOM (Modelo de objeto de documentos). En este artículo voy a focalizar desde esa vista de 10.000 pies y focalizar en detalles especificos de Ajax.
En este artículo, vas a empezar con el mas fundamental y básico de todos los objetos relacionados con Ajax y de mejoras de programación: el objeto XMLHttpRequest. Este objeto es realmente el único hilo en común entre todas las aplicaciones Ajax y , como como debes esperar, vas a querer entenderlo a fondo para llevar tu programación al límite de lo posible. De hecho, vas a descubrir que aveces, para usar XMLHttpRequest apropiadamente, no vas a usar XMLHttpRequest explicitamente. De que se trata todo esto?
Web2.0 de un vistazo
Primero, toma este último pedaito de repaso antes de que te sumerjas en el código, asegurate de tener clara esta idea sobre la Web 2.0. Cuando escuchas el término Web 2.0, deberías preguntar primero ¿que es Web 1.0? Sin Embargo raramente vas a escuchar Web 1.0, esto se refiere a la web tradicional donde se tiene un modelo de petición y respuesta bastante diferente. Por ejemplo, ir a Amazon.com y presionar un botón o ingresar un término de búsqueda. Una petición es hecha el servidor y luego una respuesta vuelve a tu navegador. Esa respuesta tiene mucho más que solo una lista de libros y titulos, sin embargo; realmente es otra página HTLML completa. Como resultado, probablemente tengas algo de destelleos u oscilaciones mientras la pantalla de tu navegador es redibujada con esta nueva página HTML. De hecho podes ver claramente la petición y la respuesta, delineada por cada nueva página que ves.
La Web 2.0 prescinde de esta tan visible ida y vuelta (en un alto grado). Como ejemplo, visitar un sitio como Google maps o Flickr (los links de ambos sitios web 2.0 potenciados con Ajax están de Recursos). En Gogle Maps, por ejemplo, podés mover el mapa con el mouse, ampliar o reducir la vista con muy poco redibujamiento. Por supuesto, se hacen peticion y respuesta aquí, pero todas detras de escena. Como usuario, la experiencia es mucho mas agradable y se siente mucho como una aplicación de escritorio. Esta nueva sensacion y paradigma es lo que ves cuando alguien se refiere a Web 2.0. Lo que te tiene que preocupar entonces es como hacer posible estas nuevas interacciones. Obviamente, todavía tenes que hacer peticiones y respuestas de campo, pero es el redibujamiento de el HTML para toddas interacción de petición/respuesta la que da la percepción de una interface Web lenta y pesada. Por eso claramente necesitas un acercamiento que te permitahacer peticiones y recibir respuestas que incluyan la información que necesitás, más que una página HTML entera. El único momento que vas a querer lebantar una página HTML entera es cuando... bueno... cuanto quieras que el usuario vea una nueva página.
Pero la mayoría de las interacciones agregan detalles o cambian el texto del cuerpo, o sobreponer información en las páginas existentes. En todos esos casos, Ajax y Web 2.0 acercan la posibilidad de enviar y recibir información sin actualizar una página HTML entera. Y para cualquier usuario web frecuente. Esta habilidad va a hacer que tu aplicación se sienta más rápida, más dinámica, y los traerá de vuelta una y otra vez



Etiquetas: