<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Juanma Santoyo &#187; ajax</title>
	<atom:link href="http://www.juanmasantoyo.es/index.php/category/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.juanmasantoyo.es</link>
	<description>En ocasiones me llaman friki</description>
	<lastBuildDate>Thu, 19 Jan 2012 06:33:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>XML dinámicos con asp.Net</title>
		<link>http://www.juanmasantoyo.es/index.php/2010/03/16/xml-dinamicos-con-asp-net/</link>
		<comments>http://www.juanmasantoyo.es/index.php/2010/03/16/xml-dinamicos-con-asp-net/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 19:04:33 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[asmx]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[webservice .net]]></category>
		<category><![CDATA[xml dinamicos]]></category>

		<guid isPermaLink="false">http://www.juanmasantoyo.es/?p=397</guid>
		<description><![CDATA[Desde que me inicié en el asp.Net (no hace demasiado de eso) me he estado preguntando cómo se podría hacer una llamada al servidor que devolviese un contenido XML dinámico. Dicho de otra forma, lo que yo quería era generar un contenido XML en base a un parámetro enviado por GET o POST. Estos XML son necesarios para cualquier aplicación basada en Ajax que se precie, además de ser especialmente útiles para otras situaciones (como por ejemplo, compartir contenido interno a un destinatario externo).

Pues bien, hace un par de días me surgió la necesidad y investigué un poco al respecto. En realidad, la solución que nos propone asp.Net no está nada mal: un archivo asmx que actúa como WebService. <a href="http://www.juanmasantoyo.es/index.php/2010/03/16/xml-dinamicos-con-asp-net/">Seguir leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Desde que me inicié en el asp.Net (no hace demasiado de eso) me he estado preguntando cómo se podría hacer una llamada al servidor que devolviese un contenido <em>XML</em> dinámico. Dicho de otra forma, lo que yo quería era generar un contenido XML en base a un parámetro enviado por GET o POST. Estos <em>XML</em> son necesarios para cualquier aplicación basada en <a href="http://www.juanmasantoyo.es/index.php/category/ajax/">Ajax</a> que se precie, además de ser especialmente útiles para otras situaciones (como por ejemplo, compartir contenido interno a un consumidor externo).</p>
<p>Pues bien, hace un par de días me surgió la necesidad y investigué un poco al respecto. En realidad, la solución que nos propone <em>.Net</em> no está nada mal: un archivo <em>.asmx</em> que actúa como <em>WebService</em>.<br />
<span id="more-397"></span></p>
<h3>Sobre los <em>.asmx</em></h3>
<p>De la misma forma que podemos añadir archivos <em>.aspx</em> a un proyecto web, también podemos añadir archivos <em>.asmx</em>. Estos archivos son la base de cualquier proyecto de <em>WebService</em> que desarrollemos en <em>.Net</em>, pero también podemos usarlos en los proyectos web normales.</p>
<h3>¿Cómo se usan los <em>.asmx</em>?</h3>
<p>El uso de los <em>.asmx</em> es simple: básicamente, lo que debemos hacer es crear un método, que devuelva un valor y que tenga la etiqueta [WebMethod]. Al final, la llamada a servidor: &#8220;http://&lt;ruta al asmx&gt;/&lt;nombre del método&gt;/&lt;parámetros get si hay&gt;&#8221; nos devolverá el resultado devuelto por el método.</p>
<p>Por supuesto, el método puede tener parámetros, que enviaremos por <em>GET</em> o por <em>POST</em>; en cuyo caso, al hacer la llamada los parámetros enviados deberán tener el mismo nombre que el parámetro en el método.</p>
<p>Es importante destacar que si queremos enviar parámetros por <em>GET</em> o <em>POST</em>, deberemos activar ambos protocolos en el <em>Web.config</em> de nuestra aplicación.</p>
<h3>Un ejemplo</h3>
<p>La mejor forma de ver cómo funciona un <em>.asmx</em> es viendo un pequeño ejemplo. Con poco esfuerzo podremos hacer algunas pruebas.</p>
<h4>Crear el proyecto</h4>
<p>Sólo necesitaremos crear un nuevo proyecto web en nuestro Visual Studio. Nos creará por defecto un <em>.aspx</em>, pero no nos interesa demasiado.</p>
<h4>Crear el asmx</h4>
<p>Añadiremos en el proyecto web un nuevo elemento, que será un Servicio web. Lo encontrarás entre los posibles elementos de la categoría &#8220;Web&#8221;. Lo llamaremos &#8220;<em>test.asmx</em>&#8220;.</p>
<p>Cuando tengamos nuestro <em>.asmx</em> creado, lo estableceremos como la página inicial de nuestro proyecto (es una opción que aparecerá si clicamos con el botón derecho en el <em>.asmx</em>).</p>
<h4>Un nuevo método en el <em>.asmx</em></h4>
<p>En el <em>.asmx</em> ya tenemos un método creado: <em>HelloWorld</em>. Es muy ilustrativo, ya que nos indica dos cosas: la primera, que nuestros métodos deberán tener al principio la etiqueta <strong>[WebMethod]</strong>. La segunda, que el valor retornado será lo que mostrará nuestro <em>WebService</em> al realizar una petición al método.</p>
<p>Vamos a programar un método más bien absurdo, pero que nos permitirá ver cómo funciona el envío de parámetros:</p>
<pre class="brush:csharp">
	[WebMethod]
	public string ReturnThisString(string str)
	{
		return str;

	}
</pre>
<p>Hay dos cosas a destacar:</p>
<ol>
<li>El parámetro que recibe este método se llama <strong>str</strong>.</li>
<li>El resultado que genera este método, es un <em>string</em>.</li>
</ol>
<h3>Activamos los protocolos <em>GET</em> y <em>POST</em></h3>
<p>Como dije unas líneas más arriba, debemos activar los protocolos de envío <em>GET</em> y <em>POST</em> si queremos usarlos en nuestro <em>WebService</em>. Todo lo que debemos hacer es incluir <strong>dentro</strong> del nodo <em>&lt;system.web/&gt;</em> de nuestro <em>Web.config</em> las siguientes líneas:</p>
<pre class="brush:xml">
	&lt;webServices&gt;
		&lt;protocols&gt;
			&lt;add name=&quot;HttpGet&quot; /&gt;
			&lt;add name=&quot;HttpPost&quot; /&gt;
		&lt;/protocols&gt;
	&lt;/webServices&gt;
</pre>
<h4>Probamos el <em>WebService</em></h4>
<p>Y toca inicar una depuración. La primera vez que lo hagamos nos pedirá que activemos el modo debug. Le decimos que sí, y arrancará el <em>.asmx</em>.</p>
<p><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-01-e1268766894973.png"><img src="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-01-e1268766894973.png" alt="Métodos del WebService" title="Métodos del WebService" width="450" height="131" class="aligncenter size-full wp-image-403" /></a></p>
<p>Lo que veremos, será un resumen de los métodos que tiene el <em>.asmx</em> (esto no se vería en un entorno de producción). Podemos clicar en el nombre de nuestro método &#8220;<em>ReturnThisString</em>&#8221; para que nos muestre un pequeño formulario donde indicaremos el valor del parámetro &#8220;<em>str</em>&#8220;. Al enviarlo, veremos el resultado de nuestro método de <em>WebService</em>.</p>
<p><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-02-e1268766971605.png"><img src="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-02-e1268766971605.png" alt="Formulario de envío de parámetros" title="Formulario de envío de parámetros" width="450" height="244" class="aligncenter size-full wp-image-404" /></a></p>
<p>Hay varias cosas interesantes en las que fijarse ahora:</p>
<ol>
<li>
		El resultado devuelto es un XML.	</p>
<p>		Sea cual sea el resultado, el asmx siempre nos dará una respuesta XML.
	</li>
<li>
		La ruta de la página.</p>
<p>		Como ves, la url de este xml es: &#8220;http://&lt;ruta al asmx&gt;/&lt;nombre del método&gt;/&lt;parámetros get si hay&gt;&#8221;. Esta es la dirección a la que accederemos para obtener resultados de nuestro <em>WebService</em>, ya sea con <em>Ajax</em> o con otra tecnología.
	</li>
<li>
		El nodo <em>string</em>.</p>
<p>		El resultado del método viene, en realidad, dentro de un nodo llamado <em>string</em>. Esto es, efectívamente, el tipo del dato devuelto. ¿imaginas lo que pasaría si en vez de un <em>string</em>, devolvemos una lista de <em>strings</em>? Efectivamente, el <em>XML</em> resultante sería una lista de nodos <em>string</em>.</p>
<p><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-03-e1268766951190.png"><img src="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-03-e1268766951190.png" alt="Resultado de una llamada al método ReturnThisString" title="Resultado de una llamada al método ReturnThisString" width="450" height="114" class="aligncenter size-full wp-image-405" /></a>
	</li>
</ol>
<h4>Generamos un <em>XML</em> como respuesta del método</h4>
<p>Como ves, los <em>WebServices</em> <em>.asmx</em> no son demasiado complicados, aunque por el momento seguimos teniendo un pequeño problema: los <em>XML</em> que generamos como resultado son generados automáticamente y no tenemos control sobre ellos. Vamos a poner solución a esto.</p>
<p>La cuestión es que si en lugar de un <em>string</em>, devolvemos un objeto <em>XmlDocument</em>, el resultado devuelto por el <em>WebService</em> será el contenido del <em>XmlDocument</em> tal cual. Por lo tanto, se podría decir que el proceso para generar respuestas <em>XML</em> personalizadas (la razón de este artículo) es el siguiente:</p>
<ol>
<li>Creamos un método en el <em>.asmx</em> que devuelva un objeto <em>XmlDocument</em>.</li>
<li>Obtenemos todos los datos que queramos devolver.</li>
<li>Los metemos en un <em>XmlDocument</em>.</li>
<li>Retornamos el <em>XmlDocument</em>.</li>
</ol>
<h4>Un último ejemplo</h4>
<p>Vamos a crear un último ejemplo: un pequeño método que nos introducirá en la creación de <em>XML</em> dinámicos:</p>
<pre class="brush:csharp">
	[WebMethod]
	public XmlDocument ReturnXml()
	{
		XmlDocument xml = new XmlDocument();

		XmlNode rootNode = xml.CreateElement("RespuestaXml");
		XmlNode txtNode = xml.CreateTextNode("Xml generado automáticamente");
		XmlNode subNode = xml.CreateElement("HolaMundo");
		XmlNode commentNode = xml.CreateComment("Esto es un comentario");

		subNode.AppendChild(commentNode);
		rootNode.AppendChild(txtNode);
		rootNode.AppendChild(subNode);
		xml.AppendChild(rootNode);

		return xml;
	}
</pre>
<p>Esto generaría el siguiente resultado:</p>
<p><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-04-e1268766930458.png"><img src="http://www.juanmasantoyo.es/wp-content/uploads/2010/03/XmlDinamicosAspNet-04-e1268766930458.png" alt="Resultado de una llamada al método ReturnXml" title="Resultado de una llamada al método ReturnXml" width="450" height="211" class="aligncenter size-full wp-image-406" /></a></p>
<h3>Descargar el ejemplo</h3>
<p>Puedes descargar el ejemplo si algo no te ha quedado claro. Recuerda también que puedes dejar comentarios.</p>
<p><a href='http://www.juanmasantoyo.es/wp-content/uploads/2010/03/JuanmaSantoyoXmlDinamicos.zip'>JuanmaSantoyoXmlDinamicos</a></p>
<h3>¡Hemos terminado!</h3>
<p>Y de momento no hay mucho más que decir. Con este ejemplo, hemos tocado un tema especialmente importante para la mayoría de proyectos web, ya que los <em>XML</em> dinámicos son importantes para las funcionalidades <em>Ajax</em> y para comunicarnos con otras aplicaciones externas. ¿Aún no tienes RSS en tu sitio web? <a href="http://www.rssboard.org/rss-specificationg">¡A qué esperas!</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanmasantoyo.es/index.php/2010/03/16/xml-dinamicos-con-asp-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manual básico de Ajax (Parte 2)</title>
		<link>http://www.juanmasantoyo.es/index.php/2010/02/05/manual-basico-de-ajax-parte-2/</link>
		<comments>http://www.juanmasantoyo.es/index.php/2010/02/05/manual-basico-de-ajax-parte-2/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 13:50:26 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://www.juanmasantoyo.es/?p=247</guid>
		<description><![CDATA[Bueno, la teoría es necesaria pero lo bonito, y lo que a todos nos gusta es pringarnos las manos. Vamos allá con un ejemplo simple de Ajax. <a href="http://www.juanmasantoyo.es/index.php/2010/02/05/manual-basico-de-ajax-parte-2/">Seguir leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>¡Pasemos a la acción!</h3>
<p>Bueno, la teoría es necesaria pero lo bonito, y lo que a todos nos gusta es pringarnos las manos. Vamos allá con un ejemplo simple de Ajax.<br />
<span id="more-247"></span><br />
El ejemplo consistirá en programar dos select. En el primero, tendremos una lista de países, y en el segundo una lista de ciudades. Lo que haremos, será modificar el select de ciudades en función del país seleccionado en el select de países.</p>
<p>El ejemplo tendrá tres partes: primero, programaremos la página HTML que contendrá los dos selects. Después programaremos un script de servidor en PHP, que será la petición Ajax y que generará la respuesta que contendrá toda la información sobre ciudades. Por último, programaremos un archivo JS que realizará la petición Ajax y que hará todas las gestiones pertinentes con el fin de presentar los resultados dentro del select de ciudades.</p>
<h4>El código fuente</h4>
<p>Este es el código fuente para este ejemplo. Te recomiendo que vayas mirando los archivos mientas los voy comentando:</p>
<p><a href='http://www.juanmasantoyo.es/wp-content/uploads/2010/02/nociones-basicas-de-ajax-src.zip'>Nociones básicas de Ajax (código fuente)</a>.</p>
<h4>La página HTML</h4>
<p>No nos complicaremos. Cumpliremos los requisitos básicos para generar un XHTML válido y fácil de maquetar con CSS; y que conste que es por orgullo propio, porque realmente al Ajax le va a dar igual si nuestro HTML valida o no.</p>
<p>En resumen, dos campos select y poco más.</p>
<h4>El Script PHP.</h4>
<p>En este caso, vamos a hacerlo fácil: guardaremos en arrays información sobre países y ciudades; y el script se limitará a recibir el país por GET y montar una salida XML que contenga los resultados.</p>
<p>Destacar que lo mismo que yo uso arrays, se podría hacer, por ejemplo; un acceso a base de datos. Y, obviamente, se podría usar cualquier otro lenguaje de servidor para generar el XML, como jsp o asp.</p>
<p>El XML generado será más o menos algo como esto:</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;pais codigo="1" nombre="España"&gt;
	&lt;ciudad codigo="101"&gt;Madrid&lt;/ciudad&gt;
	&lt;ciudad codigo="102"&gt;Barcelona&lt;/ciudad&gt;
	&lt;ciudad codigo="103"&gt;Palma de Mallorca&lt;/ciudad&gt;
	&lt;ciudad codigo="104"&gt;Sevilla&lt;/ciudad&gt;
	&lt;ciudad codigo="105"&gt;Valencia&lt;/ciudad&gt;
	&lt;ciudad codigo="106"&gt;Bilbao&lt;/ciudad&gt;
&lt;/pais&gt;</pre>
<p>Destacar dos cosas: los códigos de las ciudades se han generado mediante una sencilla fórmula:<br />
(código de la ciudad) = ((índice del país) * 100) + (índice de la ciudad)</p>
<p>Por otra parte, el código XML se ha montado en una línea única. Esto se hace así para no tener que lidiar con los saltos de línea cuando analicemos el XML con JavaScript (cada navegador los interpreta a su manera).</p>
<h4>El script JavaScript</h4>
<p>Ahora viene lo bueno. Este script hará tres cosas: gestionará la petición Ajax a ciudades.php, procesará el objeto XML resultante, y mostrará el resultado en pantalla.</p>
<p>Esta es con toda seguridad la parte más compleja de la pequeña aplicación que estamos programando.</p>
<p>A partir de ahora, el código merece una digna explicación, por lo que comentaré una a una todas las funciones del archivo js.</p>
<p>Empecemos con dos funciones sencillas: dos escuchadores de eventos.</p>
<pre class="brush:js">function paginaCargada()
{
	var pais = document.getElementById("pais");
	var ciudad = document.getElementById("ciudad");

	pais.disabled = false;
	pais.value = 0;

	ciudad.disabled = false;
	ciudad.value = 0;
}

function paisCambiado(select)
{
	var ciudades = document.getElementById("ciudad");
	ciudades.disabled = true;

	_actualizarCiudades(select.value);
}</pre>
<p>El escuchador <em>paginaCargada</em>, responde al evento de body <em>onload</em> y simplemente inicia los selectores de país y ciudad. Esto es para que al refrescar con F5 no conserven el valor anterior, y por si alguno hubiese quedado desactivado (durante el ejemplo, se desactivaran mientras se realiza la petición Ajax).</p>
<p>El escuchador <em>paisCambiado</em> responde al evento <em>onchange</em> del select de países. El único parámetro que recibe es el propio select de países.</p>
<p>La función de <em>paisCambiado</em> es simple: por una parte, deshabilita el select de ciudades (ya que se están cargando sus nuevos valores) y por otra, inicia la petición Ajax mediante la función <em>_actualizarCiudades</em>.</p>
<p>La siguiente función cumple la labor más importante de todas: crear un nuevo objeto Ajax y retornarlo.</p>
<pre class="brush:js">function ajax()
{
	var httpRequest = null;

	if (window.XMLHttpRequest)
	{
		//El explorador implementa el interfaz de forma nativa
		httpRequest = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		//El explorador permite crear objetos ActiveX
		try
		{
			httpRequest = new ActiveXObject("MSXML2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{

			}
		}
	}

	return httpRequest;
}</pre>
<p>Una de las perticularidades del objeto <em>XMLHTTPRequest</em> (o ajax) es que está implementado de forma distinta en cada navegador. Firefox y la mayoría, lo traen implementado junto al resto de funcionalidades JavaScript, pero Internet Explorer lo trae implementado como un control ActiveX. Esta función hace exactamente eso: hace una detección de las funcionalidades del navegador y actúa en consecuencia para obtener una instancia del objeto <em>XMLHTTPRequest</em> y retornarla. Esta es una función muy típica, que de hecho ni siquiera es mía… en realidad la he copiado de la wikipedia: <a href="http://es.wikipedia.org/wiki/XMLHttpRequest">XMLHttpRequest en Wikipedia</a>.</p>
<p>Este objeto será el que realice las peticiones asíncronas y el que nos permita obtener los resultados.</p>
<p>Y todas estas cosas se hacen en la siguiente función: <em>_actualizarCiudades</em>. Mención especial a dos detalles: por una parte, fijaos en que a esta función la acompaña una variable global <em>ajx</em>. Por otra, fijaos en que el nombre de esta función empieza con un underscore. En este script, las funciones que empiezan con underscore son “teóricamente” privadas, o dicho de otra forma; son funciones que en teoría no deberían ser usadas desde fuera del script.</p>
<pre class="brush:js">var ajx = null;
function _actualizarCiudades(pais)
{
	if(ajx != null &amp;&amp; ajx.readyState != 4 &amp;&amp; ajx.readyState != 0)
	{
		ajx.abort();
	}

	ajx = ajax();
	var url = "ciudades.php?pais=" + pais;

	ajx.open("GET", url);
	ajx.send();

	ajx.onreadystatechange = function()
	{
		if(ajx.readyState == 4 &amp;&amp; ajx.status == 200 &amp;&amp; ajx.responseXML != null)
		{
			_ciudadesCargadas(ajx.responseXML);
			ajx = null;
		}
	}
}</pre>
<p>Veamos, lo primero a comentar de esta función es el primer if, y la razón de que el objeto <em>XMLHTTPRequest</em> se defina sobre una variable global <em>ajx</em>.</p>
<p>La idea es que las peticiones Ajax puedan ser canceladas si se intenta enviar una petición mientras hay otra en curso. Para ello, se basa en el valor de la propiedad <em>readyState</em>. Si el objeto <em>ajx</em> tiene la propiedad <em>readyState</em> en valores distintos a 4 (finalizado) o 0 (sin iniciar); es que existe una petición en curso y debe abortarse antes de que se inicie una nueva. Creo que esto se entenderá mejor con un pequeño diagrama de flujo:</p>
<p><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/02/nociones-basicas-de-ajax-102.png"><img class="aligncenter size-full wp-image-258" title="Gestión de peticiones Ajax" src="http://www.juanmasantoyo.es/wp-content/uploads/2010/02/nociones-basicas-de-ajax-102.png" alt="" width="320" height="370" /></a></p>
<p>Ahora que estamos seguros de que no hay ninguna petición en curso, creamos un nuevo objeto Ajax.</p>
<p>Y lo que toca ahora, es crear la petición al servidor propiamente dicha. Lo primero, montar la URL a la que se accederá. Fijaos en que en este momento, concatenamos las variables que enviaremos por GET. Si quisiéramos hacer un POST, enviaríamos las variables en el método <em>ajx.send</em> (lo veremos en breve).</p>
<p>Ahora que tenemos la URL, y sabemos cómo enviaremos la información; podemos inicializar dichos valores en el objeto Ajax. Para ello usamos el método <em>ajx.open</em>.</p>
<p>Ahora el objeto <em>XMLHTTPRequest</em> sabe todo lo necesario para realizar una petición: la dirección, los parámetros a enviar, y la forma de enviarlos. Sólo nos queda lanzarla, y lo hacemos con el método <em>ajx.send</em>. Este método podría enviar también las variables POST en un objeto JavaScript. Algo como:</p>
<pre class="brush:js">ajx.send({
		var1 : “valor 1”
		, var2 : “valor2”
});</pre>
<p>Por último, necesitaremos controlar el estado de la petición para saber cuándo está lista, y actuar en consecuencia. Eso lo hacemos con un controlador de eventos, y el evento en cuestión es: <em>ajx.onreadystatechange</em>.</p>
<p>Este controlador se ejecutará cada vez que el valor de la propiedad <em>ajx.readyState</em> cambie, por lo que necesitaremos realizar una serie de validaciones antes de asumir que la petición ha finalizado:</p>
<p>Por una parte, necesitamos controlar que el valor de <em>ajx.readyState</em> sea 4 (que quiere decir que la petición ha finalizado), y por otra, necesitamos controlar que el valor de <em>ajx.status</em> sea 200 (este es el valor que retorna el servidor y que significa que no ha habido errores al servir la petición). No está de más comprobar que la propiedad <em>ajx.responseXML</em> contenga algún valor, ya que es donde esperamos encontrar el resultado.</p>
<p>Y ahora que sabemos que nuestra petición ha finalizado de forma satisfactoria, debemos analizar el resultado. Esto lo hará la función <em>_ciudadesCargadas</em>.</p>
<pre class="brush:js">function _ciudadesCargadas(xml)
{
	var ciudad = document.getElementById("ciudad");	

	var ciudadesDat = _parseaCiudades(xml);

	_actualizarSelectCiudades(ciudad, ciudadesDat);

	ciudad.disabled = false;
}</pre>
<p>Y el funcionamiento de esta función es muy simple. Se limita a hacer dos cosas: por una parte, procesa el resultado en la propiedad <em>ajx.responseXML</em> mediante la función <em>_parseaCiudades</em> y obtiene toda la información del xml en un objeto de JavaScript (bastante más manejable que el objeto XML que obtenemos del <em>ajx</em>), y por otra parte, envía el objeto al método <em>_actualizarSelectCiudades</em>, que se encarga de modificar el select de ciudades con los nuevos valores.</p>
<p>Además, una vez que todo el proceso ha terminado; esta función activará el select de ciudad (que se desactivó al lanzar la petición).</p>
<p>Esta sería la función que parsea el XML:</p>
<pre class="brush:js">function _parseaCiudades(xml)
{
	var data = {
		pais: null
		, ciudades: []
	};

	var pais = {
		codigo: null
		, nombre: null
	};

	var mainNode = null;

	//buscamos el nodo principal. no podemos asegurar su posición en el objeto xml por razones de crossbrowsing.
	for(var i = 0; i &lt; xml.childNodes.length; i++)
	{
		var node = xml.childNodes[i];
		if (node.nodeName == "pais")
		{
			mainNode = node;
			break;
		}
	}

	//rellenamos la estructura pais y lo añadimos a la estructura data.
	pais.codigo = mainNode.getAttribute("codigo");
	pais.nombre = mainNode.getAttribute("nombre");

	data.pais = pais;

	var ciudades = new Array();
	//creamos un array de estructuras ciudad y lo añadimos a la estructura data.
	for(var i = 0; i &lt; mainNode.childNodes.length; i++)
	{
		var node = mainNode.childNodes[i];

		if(node.nodeName == "ciudad")
		{
			ciudades[ciudades.length] = {
				codigo: node.getAttribute("codigo")
				, nombre: node.firstChild.nodeValue
			};
		}
	}

	data.ciudades = ciudades;

	return data;
}</pre>
<p>Lo cierto es que él código que encontramos en esta función merece un tutorial aparte. Os invito a que consideréis el código por vuestra cuenta porque de hecho no es demasiado complejo.</p>
<p>Sólo destacar un par de detalles: el objeto <em>mainNode</em> es el nodo principal del XML. En nuestro caso sería el nodo <em><br />
</em>, y por razones de crosbrowsing tenemos que hacer una búsqueda para encontrarlo (es decir, no podemos asumir que lo encontraremos en una posición determinada).</p>
<p>Por otra parte, notar que lo que hace el objeto en realidad es montar un objeto JavaScript con toda la información y retornarlo. Un objeto más o menos así:</p>
<pre class="brush:js">data = {
	país : {
		codigo : ""
		, nombre : ""
	}
	, ciudades : [
		{
            codigo : ""
			, nombre : ""
		}
		, {
            codigo : ""
			, nombre : ""
		}
		, …
	]
}</pre>
<p>Y este objeto llegará a la función <em>_actualizarSelectCiudades</em>, que cambiará la información que contiene el select de ciudades:</p>
<pre class="brush:js">function _actualizarSelectCiudades(ciudad, data)
{
	var isIe = '\v' == 'v'; //true si estamos en internet explorer

	//vaciamos el option
	var i = 0;
	while(ciudad.options.length &gt; 0)
	{
		ciudad.options[0] = null;
	}

	//añadimos los nuevos elementos
	for(var i = 0; i &lt; data.ciudades.length; i++)
	{
		var el = document.createElement("option");
		el.value = data.ciudades[i].codigo;
		el.text = data.ciudades[i].nombre;

		if(!isIe)
		{
			ciudad.add(el, null);
		}
		else
		{
			ciudad.add(el);
		}
	}
}</pre>
<p>Lo que se hace en esta función, es HTML Dom puro y duro. Es decir, modificar los elementos HTML mediante JavaScript. Primero vacía todo lo que hay en el select, y después añade los nuevos valores. Fijaos en la variable isIe: Detecta la funcionalidad del navegador para saber si estamos en Internet Explorer. Necesitamos saberlo por motivos de crossbrowsing, ya que los option se añaden de forma diferente en Internet Explorer y en el resto de navegadores.</p>
<h4>¡Hemos terminado!</h4>
<p>Después de este ejemplo, ya deberíamos tener más o menos claro como funciona una aplicación basada en Ajax. Hay que tener en cuenta que esto se puede complicar o simplificar tanto como uno quiera. Nuestro ejemplo ha sido muy sencillo, pero Ajax tiene mucha más potencia que esto si se usa bien.</p>
<p>Por otra parte, frameworks como <a href="http://jquery.com/">JQuery</a> o <a href="http://mootools.net/">Mootools</a> pueden llegar a simplificar muchísimo el trabajo con Ajax. Si realmente te interesa programar basado en Ajax, es obligatorio que les dediques unos minutos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanmasantoyo.es/index.php/2010/02/05/manual-basico-de-ajax-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manual básico de Ajax (Parte 1)</title>
		<link>http://www.juanmasantoyo.es/index.php/2010/02/05/nociones-basicas-de-ajax-parte-1/</link>
		<comments>http://www.juanmasantoyo.es/index.php/2010/02/05/nociones-basicas-de-ajax-parte-1/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 13:49:55 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.juanmasantoyo.es/?p=235</guid>
		<description><![CDATA[Aún hoy en día, varios años después de la salida de Gmail o google maps y la consiguiente popularización de Ajax, muchos desarrolladores no tienen claro de qué va esto y cómo funciona. 

En este artículo pretendo aclarar todo lo que se necesita saber para empezar a hacer pequeñas cosas con Ajax, y aportar una base para poder ampliar conocimientos sobre el tema con la idea de poder afrontar aplicaciones basadas en Ajax más complejas.

Inicialmente, este artículo iba a publicarse completo, pero como es algo extenso, lo dividiré en dos partes: primero, entenderemos qué es Ajax y cómo funciona. En la segunda parte, programaremos un sencillo ejemplo basado en Ajax.

Conviene avisar de que para poder entender algo de lo que se comenta en este artículo, se deben tener conocimientos medios de Java Script y PHP, y conocimientos básicos de HTML. <a href="http://www.juanmasantoyo.es/index.php/2010/02/05/nociones-basicas-de-ajax-parte-1/">Seguir leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Aún hoy en día, varios años después de la salida de Gmail o google maps y la consiguiente popularización de Ajax, muchos desarrolladores no tienen claro de qué va esto y cómo funciona. </p>
<p>En este artículo pretendo aclarar todo lo que se necesita saber para empezar a hacer pequeñas cosas con Ajax, y aportar una base para poder ampliar conocimientos sobre el tema con la idea de poder afrontar aplicaciones basadas en Ajax más complejas.</p>
<p>Inicialmente, este artículo iba a publicarse completo, pero como es algo extenso, lo dividiré en dos partes: primero, entenderemos qué es Ajax y cómo funciona. En la segunda parte, programaremos un sencillo ejemplo basado en Ajax.</p>
<p>Conviene avisar de que para poder entender algo de lo que se comenta en este artículo, se deben tener conocimientos medios de Java Script y PHP, y conocimientos básicos de HTML.<br />
<span id="more-235"></span></p>
<h3>¿Qué es Ajax?</h3>
<p>La mejor forma de comprender qué es Ajax, es averiguar de dónde salen las siglas A.J.A.X.</p>
<p>Ajax significa “Asynchronous Java script And XML”. O en nuestra lengua: “Java script asíncrono y XML”.</p>
<p>De toda la definición, quizás lo más importante sea el concepto “asíncrono”, porque es la clave de todo: al fin y al cabo, lo que nos va a permitir el objeto Ajax es realizar una petición http asíncrona al servidor y procesar su resultado.</p>
<p>Que sea una petición http asíncrona, quiere decir que todo ocurrirá en segundo plano, sin que el usuario se dé cuenta de lo que está pasando.</p>
<p>Típicamente, la petición al servidor generará un resultado XML, aunque no tiene por qué (de ahí que XML se incluya en la definición de Ajax). Y no sólo eso, si no que dicho resultado vendrá en forma de objeto DOM y será fácilmente procesado mediante JavaScript.</p>
<p>Sin embargo, el resultado de una petición Ajax también puede obtenerse como texto plano o como HTML.</p>
<p>Resumiendo, Ajax:</p>
<ul>
<li>Es un objeto JavaScript que aportará el propio navegador.</li>
<li>Permitirá realizar peticiones asíncronas al servidor.</li>
<li>Aportará un resultado procesado como XML, HTML o, simplemente, un texto plano.</li>
</ul>
<h3>Un poco de arquitectura Web básica</h3>
<p>No podemos entender cómo trabaja Ajax, o cómo programar con Ajax; si no tenemos una idea clara de cómo es la arquitectura web básica.</p>
<p>Ajax trabaja como intermediario entre el cliente y el servidor, de ahí que es importante saber de forma básica cómo actúan ambos al realizar una petición http.</p>
<p>Antes que nada, el cliente (que supondremos que es un navegador) realiza una petición al servidor. Básicamente, solicitará un archivo.</p>
<p>El servidor escucha la petición y la resuelve. Esto, puede implicar muchas cosas. Puede ser simplemente localizar un archivo .html y enviarlo al cliente, o puede ser localizar un archivo .php, interpretarlo, acceder a base de datos, etc; para luego generar un nuevo código .html y enviarlo al cliente. Ésta es la parte más importante de nuestra aplicación web, ya que la parte de la aplicación que trabaja en el servidor será la única que no estará limitada por las funcionalidades del cliente. Por ejemplo, no podríamos acceder a base de datos con una tecnología de navegador como JavaScript.</p>
<p><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/02/nociones-basicas-de-ajax-101.png"><img src="http://www.juanmasantoyo.es/wp-content/uploads/2010/02/nociones-basicas-de-ajax-101.png" alt="" title="Arquitectura Cliente - Servidor" width="370" height="95" class="aligncenter size-full wp-image-240" /></a></p>
<p>Por lo tanto, hay cosas que nuestra aplicación sólo puede hacer en el lado del servidor. Y para obtener un resultado del servidor, necesitamos generar una nueva petición desde el navegador. Hablando en términos más sencillos: necesitamos recargar la página.</p>
<p>En este punto es donde entra en juego Ajax. Con Ajax, podremos generar esa petición en segundo plano. A base de JavaScript, podemos lanzar la petición, esperar el resultado del servidor, y mostrarlo en pantalla sin que nada de esto interrumpa la ejecución de la aplicación principal.</p>
<h3>Algunos ejemplos</h3>
<p>Para entender bien qué implica la posibilidad de realizar una petición al servidor en segundo plano, veamos algunos ejemplos.</p>
<h4>Caso Gmail</h4>
<p>Cuando Google lanzó Gmail, los servicios de Web mail estaban muertos. Nadie confiaba en ellos y siempre era preferible usar un cliente de correo de escritorio. Lo que hace de Gmail un cliente de Web mail tan especial, es que precisamente funciona exactamente igual que un cliente de correo de escritorio; esto se debe a que Gmail fue la primera aplicación web basada en Ajax.</p>
<p>Todo se basa en un detalle: Gmail es capaz de revisar periódicamente los correos entrantes, y mostrar los nuevos resultados en pantalla sin que ello implique un refresco de página. De forma que el usuario puede ver cómo llegan nuevos correos mientras está redactando uno, o mientras está leyendo. Dicho en otras palabras: Gmail es capaz de notificar la existencia de nuevos correos mediante peticiones al servidor que se realizan en segundo plano.</p>
<h4>Caso Google Maps</h4>
<p>No hay duda de que Google Maps es una de las aplicaciones más espectaculares de los últimos años. Y sin embargo, su funcionamiento es realmente simple. Sin Ajax, un Google Maps no sería posible, o al menos no sin Flash o otras tecnologías externas al navegador.</p>
<p>En realidad, Google Maps simplemente se dedica a analizar en qué posición del mapamundi estamos y que zoom estamos usando. Una vez concretados estos parámetros, se lanza una petición al servidor mediante Ajax, y el servidor notificará al cliente qué imágenes debe cargar, y en qué posición del mapa debe colocarlas. Sobra decir que sólo cargamos las imágenes del mapamundi que se están viendo en ese momento en la pantalla.</p>
<p>Por lo tanto, una vez más vuelve a ocurrir: se han obtenido resultados calculados por el servidor sin que ello haya implicado un refresco de página.</p>
<h3>Es todo por hoy</h3>
<p>Ahora ya sabemos lo básico de Ajax: sabemos cómo funciona y para qué sirve. En la segunda parte de este artículo, veremos un ejemplo que nos ayudará a comprender mejor cómo funciona la programación basada en Ajax.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanmasantoyo.es/index.php/2010/02/05/nociones-basicas-de-ajax-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

