He estado jugando un rato con los famosos HTTP Web Requests, que desde que se usan en GMail o Google Suggest, para evitar recargas de páginas se han puesto muy de moda.

La forma de utilizarlo es realmente simple, ya que todo se basa en utilizar el correspondiente objeto para leer los datos remotos que necesitemos. La principal dificultad estriba en que para Internet Explorer tenemos diferentes componentes ActiveX que podemos instanciar, y no todos tienen porque estar instalados en el sistema. En cambio los navegadores basados en Gecko, lo soportan nativamente, y Opera solamente a partir de la versión 8.

La referencia más sencilla, es la que habla de IXMLHTTPRequest en el MSDN.

Aunque estas clases fueron diseñadas inicialmente para obtener datos XML, virtualmente funcionan con cualquier formato.

El siguiente ejemplo, desde Javascript, lee el código HTML de si mismo, y lo muestra por pantalla. Esta idea es perfectamente aplicable en nuestros desarrollos para evitar la recarga de páginas y las soluciones truculentas con frames/iframes.

<html>
<body>
<script language="Javascript">
var oHttp=false;
[email protected]_on @*/
[email protected] (@_jscript_version>=5)
{
var asParsers=['Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'];
for (var iCont=0; ((!oHttp) && (iCont<asParsers.length)); iCont++)
{
try
{
oHttp=new ActiveXObject(asParsers[iCont]);
}
catch(e)
{
oHttp=false;
}
}
}
@end @*/
if ((!oHttp) && (typeof XMLHttpRequest!='undefined'))
{
oHttp=new XMLHttpRequest();
}
oHttp.open('GET', 'httpwebrequest.html', false);
oHttp.send(null);
alert(oHttp.responseText);
</script>
</body>
</html>

Aquí podéis ver en acción el anterior código (probado con Internet Explorer 6 SP2, Firefox 1.0+ y Opera 8.0 beta 1).

Con XMLHttpRequest, se abren nuevas posibilidades al Javascript: Lectores de feeds, refresco inteligente, …

Utilizándolo asíncronamente, podemos resolver la sincronización de combos anidados de forma sencilla, o por qué no, implementar un juego multijugador con DHTML.