Page 1 of 1

TIP:Usando AJAX con Harbour

PostPosted: Wed Jul 16, 2008 9:06 am
by thefull
Bueno, el TIP de dia, como usar AJAX y Harbour y no morir en el intento.

Introdución.
Tengo una aplicación que cada X tiempo realiza una peticion a un PHP para informar de que la aplicación esta funcionando.

Herramientas a usar.
Objeto a usar MSXML2.XMLHTTP, vamos esto es el AJAX. ( A grandes rasgos )

Function CREATEHTTP()
Local oHttp

try
oHttp := CreateObject( "MSXML2.XMLHTTP.6.0" ) // Version.
catch e
try
oHttp := CreateObject( "MSXML2.XMLHTTP.4.0" ) // Version.
catch e
try
oHttp := CreateObject( "MSXML2.XMLHTTP" ) // Version.
catch e
? "Error en el creacion de MSXML2.XMLHTTP" + CRLF )
end
end
end


RETURN oHttp

Bien , realmente todo esto lo tengo montado como una clase, pero... os lo dejo como función que será más didactico.

Ahora vamos a enviar los datos a un PHP cualquier, y ademas, lo haremos asincronico , para poder controlar un timerout propio.
Os aseguro que esto es lo que usan la gente de PHP, yo me he quedado alucinado de lo mal, según mis gustos, que esta montado esto, empezando CON LA MARDITA CACHE DE LAS NARICES, que ahora veremos que hacer para no tener problemas.

/***************************************************************************/
// Informe de activada, estoy vivo.
/***************************************************************************/
Function SendPresencia( )
Local oHttp, e
Local nTime := 0
Local lAsincronico := .T.
Local cUrl := "http://www.pruyeb.es/test/bin/"+;
"Presencia.php?proceso=FIVEWIN&"+;
"app=PEPE" +;
"&time="+Time()

if ( oHttp := ::CreateHttp() ) != NIL
SysRefresh()
try
if Empty( cLog ) // Si no hay log
oHttp:Open( "GET", cUrl, lAsincronico )
oHttp:SetRequestHeader( "Content-Type","application/x-www-form-urlencoded" )
oHttp:Send() // Envia el HTML

nTime := Seconds()

// Control del Asincronico y un tiempo de 1.5 seg.
while oHttp:ReadyState != 4
if ABS( Seconds() - nTime ) >= 1.5
?"TimeOut."
EXIT
endif
SysRefresh()
enddo
if oHttp:ReadyState = 4
? oHttp:responseText + CRLF
endif
catch e
?"Error en el envio de Presencia/Log:" + CRLF + e:description )
end
endif

oHttp := NIL


RETURN NIL

Bien, aqui teneis una manera de llamar a un PHP para enviar datos, mucho mas efectivo que usar el ActiveX del Navegador, aunque tengo mis dudas ;-)

La cuestion esta en para a la URL un paramentro 'inventado', como puede ser el Time(), ¿ Porque de esto ? Muy bien.
Porque la primera vez , se envia correctamente, pero si la URL es la misma, entonces el tio TIRA DE LA CACHE, y te devuelve lo que devolvio la ultima vez, por lo tanto REALMENTE no esta llamando al PHP.

Asi es como los señores del PHP lo hacen para evitar que lo coja de la cache.
Si, he leido un poco sobre ello, y cosas como estas, pues no nos sirven;
http://www.w3.org/Protocols/rfc2616/rfc ... l#sec14.32

Además, como tampoco podemos controlar el TimerOut si lo hacemos sincronico, por las pruebas que he realizado tarda unos 20 segundos antes de darnos el control a la aplicacion.

Haciendolo asincronico, podemos controlar el timerout por nosotros mismos, y la aplicacion no se nos 'congelará'.

En fin, me a costado un montón localizar el porque no estaba informando las aplicaciones, y todo era por la mardita CACHE..

Que os aproveche!

PostPosted: Wed Jul 16, 2008 9:42 am
by Antonio Linares
Rafa,

Enhorabuena y muchas gracias por compartirlo con todos nosotros :-)

Re: TIP:Usando AJAX con Harbour

PostPosted: Sat Aug 06, 2011 4:23 pm
by Francisco
Estimado Rafa

Muy bueno el ejemplo de hecho lo uso para descargar páginas y extraer algunos contenidos. oHttp:responseText
Dime si quisiera descargar una imagen y mostrarlo en mis programas FW como sería.

Saludos y felicitaciones.

Francisco Nuñez

Re: TIP:Usando AJAX con Harbour

PostPosted: Sun Aug 07, 2011 8:33 am
by Carles
Rafa,

Muy bueno el aporte como siempre :-). El tip del time tambien es importantepara cuando estas en fase de diseño de html, cada vez q ejecutas desde el navegador un php es importante llamarlo añadiendo un parametro extra oara forzar su nueva ejecucion sino lo tienes claro. Entiendo perfectamente lo q pasaste jejeje


Gracies.