AVBAX es AJAX, pero raro (y III)

Bueno. Por fin vamos a terminar esta serie explicando la mejor utilidad que se le puede dar al AVBAX, esto es, el acceso asíncrono a un archivo XML, que para eso se inventó todo este tinglado; vamos, digo yo…

Supongamos un archivo XML (al que llamaremos archivoxml.xml para seguir con la originalidad) que guarda grupos de música y álbumes publicados y que contenga las siguientes líneas

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <xml>
    <Album ref="CD142" categoria="Pop">
      <titulo>Guapa</titulo>
      <artista>La oreja de Van Gogh</artista>
    </Album>
    <Album ref="CD720" categoria="Rock">
      <titulo>Zapatillas</titulo>
      <artista>El canto del loco</artista>
    </Album>
    <Album ref="CD024" categoria="Rap">
      <titulo>Vivir para contarlo</titulo>
      <artista>Violadores del verso</artista>
    </Album>
</xml>

Veamos primero el procedimiento Sub:

Código   
Sub ObtenerDatos()
  AVBAX.Open "GET", "archivoxml.xml"
  AVBAX.onreadystatechange = Getref("ComprobarEstadoYLeer")
  AVBAX.Send()
End Sub

Y ahora la función que recoge los datos (y controla el estado de la transacción):

Código   
Function ComprobarEstadoYLeer()
  If (AVBAX.readyState = 4) Then
    Set XMLDoc = AVBAX.responseXML.documentElement
    Set NodosXML = XMLDoc.ChildNodes
    For Each Elemento In NodosXML
      miCapaContenido.innerHtml = miCapaContenido. _
      innerHtml & "<BR>" & Elemento.ChildNodes(0). _
      NodeName & ": " & Elemento.ChildNodes(0). _
      Text & " // " & Elemento.ChildNodes(1). _
      NodeName & ": " & Elemento.ChildNodes(1).Text
    Next
    miCapaContenido.innerHtml = miCapaContenido. _
    innerHtml & "<BR><BR>" & _
    "Número de registros: " & NodosXML.Length
    Set AVBAX=Nothing
  End If
End Function

En este caso deberemos cambiar la propiedad responseText por responseXML, haciendo así que se interprete el archivo con su formato original, y no como un simple fichero de texto. Nos creamos una variable que guardará el objeto de elemento del documento con la propiedad documentElement de responseXML. Así pues, en XMLDoc se almacena el objeto de documento completo.

Para poder acceder a los distintos elementos internos del XML (o nodos para los puristas) nos servimos de otra variable para almacenarlos; esta variable será NodosXML que hace uso de la colección ChildNodes del objeto XMLDoc previamente declarado. Y ahora recorremos todos los nodos con un bucle For... Next.

Mientras leemos los nodos extraemos el nombre de cada subnodo (o nodo hijo con respecto al anterior) con la propiedad NodeName y su contenido textual con la propiedad Text. Los índices 0 y 1 se refieren a cada uno de los subnodos dependientes del anterior (0 para <titulo> y 1 para <artista>).

Entiéndase bien. Los nodos hijos del documento XML (guardados en NodosXML) son los distintos <Album>. Ahora, los nodos hijos de NodosXML son los distintos artistas y títulos de discos.

Todo el resultado se almacena en el innerHtml de la capa (objeto DIV) llamada miCapaContenido.

Por último escribimos el número de registros con la propiedad Length del objeto guardado en NodosXML.

Disponemos de multitud de propiedades para sacarle jugo a este objeto, entre otras: FirstChild, NodeType, NodeValue, OwnerDocument o ParentNode. También métodos: AppendChild, CloneNode, HasChildNodes o RemoveChild. Pero esto ya corre de vuestra cuenta y de vuestras ganas de investigar. Ajo y agua.

AVBAX es AJAX, pero raro (II)

Pos vale. Pos malegro. Y además de poder leer un archivo de texto alojado en el servidor remoto, ¿pa’ que más me sirve esto?

No se me alteren, por Dios, no se me alteren. En este segundo post vamos a explicar cómo hacer peticiones GET y POST a una página web con paso de parámetros y todo. ¡Acérquense que estamos que lo regalamos! ¡A regolvé, a regolvé!

Efectivamente, con el objeto XMLHttpRequest también podemos capturar el resultado de la petición parametrizada que escupe un ASP, o un PHP, o cualquier otro, actuando contra una base de datos.

Para peticiones GET deberemos especificar los parámetros en la línea del Open así (por ejemplo):

Código   
VBAX.Open "GET", "index.html?parametro1=Hola&parametro2=" _
& Escape(Cadena2), True

Donde Cadena2 es una variable previamente definida y con valor asignado, y Escape es una función VBScript que codifica una cadena transformándola en válida para una transacción HTTP. Esta función debe utilizarse siempre, o casi siempre, para evitarnos problemas a la hora de realizar las peticiones. Ya sabéis, nos convierte los caracteres raros para una URL (como espacios, eñes, tildes y demás) en otros todavía más raros (como +, %F1, etcétera) pero comprensibles para el navegador. ¿Cuando hablarán derecho estos paratos?

Para peticiones POST la cosa cambia un poco. Los parámetros han de pasarse desde el método Send de la siguiente manera:

Código   
AVBAX.Open "POST", "index.html", True
AVBAX.Send("parametro1=Hola&parametro2=" & Escape(Cadena2))

Como se comentó en el anterior post, entre ambas líneas de código irá la que indica la función que recogerá los resultados (la del onreadystatechange).

AVBAX es AJAX, pero raro (I)

Uno que viene mamado del BASIC del Spectrum y aborrece todo lo que suene a Java y JavaScript, tuvo que aguzar el ingenio para no perder el tren AJAX sin necesidad de utilizar una sola llave de código ni un anodino masmás de esos (que vienen a ser el contador suma de toda la vida, vaya). Por ello, y tras horas de prueba-error, llegó a la conclusión de que había inventado el AVBAX, o lo que es lo mismo, el AJAX vía VBScript. Días más tarde descubrió que ya estaba inventado y que, incluso (¡será posible!), algún avezado programador chino, o japonés, o tailandés, o lo que sea, le había llamado también AVBAX. Snif, snif.

Autorías aparte, el asincronismo con VBScript y XML es AJAX variando el leguaje script, por lo que el objetivo final es el mismo y el resultado igualico igualico. Lo único que, como no tengo la menor intención de aprender más JavaScript del que ya sé, a mí me resulta más sencillo e intuitivo.

Intentemos arrojar un poco de luz sobre el tema de la apotema comenzando, en este primer post, con un ejemplo que accede a un simple archivo de texto plano.

Al igual que con JavaScript, el primer paso consiste en crear el objeto XMLHttpRequest para poder acceder de manera asíncrona a un documento XML. Esto lo hacemos de aquesta forma:

Código   
Dim AVBAX
Set AVBAX = CreateObject ("Msxml2.XMLHttp")

Lo siguiente es definir el procedimiento Sub para obtener los datos del archivo de texto al que, haciendo gala de gran originalidad e inventiva, llamaremos archivo.txt.

Código   
Sub ObtenerDatos ()
  Dim URL
  URL = "archivo.txt"
  AVBAX.Open "GET", URL, True
  AVBAX.onreadystatechange = Getref ("ComprobarEstadoYLeer")
  AVBAX.Send ()
End Sub

El método Open prepara una conexión HTTP a través del objeto XMLHttpRequest. El primer parámetro es el método de conexión (GET o POST); el segundo parámetro es la URL para la petición HTTP (en este caso un simple fichero textual alojado en el mismo directorio que el HTML); el tercero es un parámetro booleano que toma valor True para utilizar el método asíncrono y False para el método síncrono (valga este último palabro, inexistente para el DRAE).

Por su lado, la propiedad onreadystatechange asigna la función que se ejecutará cuando la propiedad readyState (ver más adelante) cambie de valor. En este caso asignamos una función que se llama ComprobarEstadoYLeer, que definiremos a continuación. Send envía los datos de la petición.

Por último, definimos la función que comprobará el estado de la solicitud y actuará en consecuencia.

Código   
Function ComprobarEstadoYLeer ()
  If (AVBAX.readyState = 4) Then
    miCapaContenido.innerHtml = AVBAX.responseText
    Set AVBAX = Nothing
  End If
End Function

readyState toma los siguientes valores:

0 – Sin inicializar.
1 – Abierto.
2 – Enviado.
3 – Recibiendo.
4 – A punto.

Nosotros sólo podemos acceder a la respuesta cuando readyState sea igual a 3 ó 4, de ahí la condicional.

responseText devuelve el texto del documento descargado en la petición y, con la propiedad innerHtml del objeto miCapaContenido (que es una capa u objeto DIV), escribimos el resultado en pantalla. Al final descargamos el objeto de la memoria.

Por último queda decir que en el evento onClick de un botón de comando, por ejemplo, haríamos la llamada al procedimiento Sub y listo, Calisto. Chupado. No me digas.

Por supuesto, todo el código antes expuesto habría de ir contenido entre las marcas de rigor.

Welcome to my fuckin’ blog

Bienvenidos a todos y a todas a mi nuevo bitacorilla con ínfulas de weblog a lo Microsiervos. Ya sé que, a día de hoy, es imposible penetrar en este mundo de los blogs por la puerta grande, pero uno conoce alguna que otra puerta del foro e intentará, cuando menos, entretener e informar un poco al personal de lo que se cuece por los mundos recónditos de la tesnología.

Si al menos consigo que pases un ratillo agradable leyendo estos posts, pues me doy con un canto en los dientes y me cuelgo la primera medalla.

Lo dicho, eres libre de entrar o no, pero si entras, no vas a poder salir de aquí. Que lo sepas…

116 de 116«...102030...112113114115116
eBook ‘retroPLOF!’

retroPLOF!

Especifica tu dirección de correo electrónico y pulsa 'Comprar ahora'. Puedes pagar con tu cuenta de PayPal o con cualquier tarjeta bancaria.

E-mail envío eBook:

Sigue teknoPLOF! vía…
 
RSS
Twitter
Facebook
Google
 
Ready Set Click!

Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación. Más información.

CERRAR