TIP:Usando AJAX con Harbour
Posted: Wed Jul 16, 2008 9:06 am
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!
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!