Acceder a GOOGLE por SOAP
Por Ernestina García
Google uno de los buscadores
de más prestigio de la red ha incorporado recientemente la posibilidad de poder
usar su base de datos de páginas desde cualquier herramienta de desarrollo.
El producto denominado Google Web API permite a los desarrolladores poder interrogar y tomar información de más de 2 billones de
documentos Web directamente desde Google. Para lograr eso, Google usa SOAP y
WSDL de forma que los desarrolladores puedan programar en su entorno favorito –
tal como Java, Perl, o Visual Studio .NET. Y en nuestro caso Fox.
Como se recordará el SOAP (Simple
Object Access Protocol) es un protocolo basado en XML que permite comunicar
componentes y aplicaciones mediante el conocido HTTP. Es como hacer RPC
mediante HTTP y XML. De hecho es la evolución del protocolo XML-RPC que permite
hacer llamadas a procedimientos remotos usando XML como lenguaje común y HTTP
como protocolo de transporte.
Internet fue diseñada para que
múltiple sistemas se pudiesen comunicar entre si. Lo ideal es que una
aplicación pueda usar componentes de otras aplicaciones, e incluso
desarrollados en otros lenguajes. Eso se consigue actualmente mediante CORBA y
DCOM. No obstante un desarrollo con estos estándares no es fácil de lograr y,
sobre todo, la comunicación entre módulo situados remotamente da problemas. El
más típico es que haya un "firewall" por el medio. Entonces la cosa
se complica bastante. Como SOAP trabaja sobre HTTP, este problema se minimiza:
HTTP es un protocolo que se maneja muy bien con los "cortafuegos".
Propiedades de SOAP:
·
Es un protocolo ligero
·
Es simple y extensible
·
Se usa para
comunicación entre aplicaciones
·
Está diseñado para
comunicarse vía HTTP
·
No está ligado a
ninguna tecnología de componentes
·
No está ligado a ningún
lenguaje de programación
·
Está basado en XML
Para poder usarlo lo primero que tenemos que hacer es
bajarnos el fichero que se encuentra en http://www.google.com/apis/download.html
Este fichero es un .ZIP que tiene diversos ejemplos en varios lenguajes sobre como
interrogar a GOOGLE. Como era de suponer ninguno de los ejemplos está en Fox
pero ¿cuándo ha sido eso un problema para un
desarrollador de Fox?
De ese fichero tomamos únicamente el GoogleSearch.wsdl que es
el que tiene la descripción del API de Google. Lo puedes abrir con un Notepad
para hacerte una idea.
A continuación necesitamos que GOOGLE nos dé una clave para
poder usar su API. Para eso hay que ir a http://www.google.com/apis/
y seguir las indicaciones del Paso 2. Una vez cumplimentado, nos dejará en
nuestro correo una clave de acceso.

Antes de correr el ejemplo que se muestra a continuación
debes asegurarte que tienes instalado el SOAP ToolKit que viene con VFP 7.
En el código que hay a continuación deberás modificar las dos
primeras líneas poniendo tu clave y el directorio donde has dejado el googlesearch.wsdl
Nota: este
ejemplo sólo funcionará con VFP 7
*
código escrito por Hector Correa (www.visionds.com)
#define
GOOGLEKEY "Pon aquí la clave que te ha dado Google"
#define
GOOGLEWSDLFILE "G:\google\googlesearch.wsdl"
LOCAL
oGoogle as Google
LOCAL
loWS
loWS
= NEWOBJECT("Wsclient",HOME()+"ffc\_webservices.vcx")
loWS.cWSName
= "Google"
oGoogle
= loWS.SetupClient(GOOGLEWSDLFILE, [GoogleSearchService], [GoogleSearchPort])
cQuery=
"FoxPro"
nStart=
0
nMaxResults=
10
lFilter=
.f.
cRestrict=
""
lSafeSearch=
.t.
cLR=
""
cIE=
"latin1"
cOE=
"latin1"
*
Los resultados vienen en un objeto XML.
oResults
= oGoogle.doGoogleSearch( GOOGLEKEY, cQuery, nStart, ;
nMaxResults, lFilter , cRestrict ,
lSafeSearch, ;
cLR, cIE, cOE )
*
Escanea XML y busca el nodo "resultElements".
IF
TYPE( "oResults" ) != "O" OR ISNULL( oResults )
? "problemas boy"
ELSE
? oResults.length, " results were found
for [", cQuery ,"]"
? "Results will be pasted to
clipboard"
_cliptext = ""
FOR i=1 TO oResults.length
oTemp = oResults.nextnode
IF oTemp.nodename =
"resultElements"
oActualResults = oTemp.childnodes
FOR j=0 TO oActualResults.length-1
?
"=================================================="
? "Result ", j+1
? oActualResults.item(j).text
_cliptext=_cliptext+oActualResults.item(j).text
NEXT
ENDIF
NEXT
ENDIF
RETURN
*
eof()
Puede que estés trabajando con VFP 6 y quieras tener la misma
funcionalidad. Para eso en vez de apoyarnos en el SOAP TOLKIT utilizaremos el
XMLHTTP que se instala con el IE 5.0 o superior
Como puedes ver a continuación, estamos creando un mensaje SOAP por
código en el que después de poner las especificaciones mínimas como son:
SOAP-ENV: Envelope
SOAP-ENV:Body
Indicamos todos los parámetros
de nuestra consulta.
Finalmente enviamos la consulta mediante:
oHTTP.open("POST",
"http://api.google.com/search/beta2",.T.);
El resultado final es una cadena pero formateada como XML por lo que
puedo pasarmela a un cursor mediante XMLTOCURSOR (si tienes Fox 7).
Como siempre, lo mejor es probarlo.
CLEAR
oHTTP
= create('MSXML2.XMLHTTP')
strpaquete
= '<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">'
strpaquete
= strpaquete +'<SOAP-ENV:Body>'
strpaquete
= strpaquete +'<ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch" '
strpaquete
= strpaquete
+'SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'
strpaquete
= strpaquete +'<key
xsi:type="xsd:string">qKbv23ax2137d4wXf4ftL6b5dBAmd9Oc</key>'
strpaquete
= strpaquete +'<q xsi:type="xsd:string">FoxPress</q>'
strpaquete
= strpaquete +'<start xsi:type="xsd:int">0</start>'
strpaquete
= strpaquete +'<maxResults
xsi:type="xsd:int">10</maxResults>'
strpaquete
= strpaquete +'<filter
xsi:type="xsd:boolean">true</filter>'
strpaquete
= strpaquete +'<restrict
xsi:type="xsd:string"></restrict>'
strpaquete
= strpaquete +'<safeSearch
xsi:type="xsd:boolean">false</safeSearch>'
strpaquete
= strpaquete +'<lr xsi:type="xsd:string"></lr>'
strpaquete
= strpaquete +'<ie xsi:type="xsd:string">latin1</ie>'
strpaquete
= strpaquete +'<oe xsi:type="xsd:string">latin1</oe>'
strpaquete
= strpaquete +'</ns1:doGoogleSearch>'
strpaquete
= strpaquete +'</SOAP-ENV:Body>'
strpaquete
= strpaquete +'</SOAP-ENV:Envelope>'
oHTTP.open("POST",
"http://api.google.com/search/beta2",.T.);
oHTTP.SetRequestHeader("Man",
"POST http://api.google.com/search/beta2 HTTP/1.1")
oHTTP.setRequestHeader("Content-Type",
"text/xml")
oHTTP.send(strPaquete)
*- Si
te da error te sugiero que subas esta cifra
WAIT
WINDOW TIMEOUT 3
strReturn
= oHTTP.responseText
xmltocursor(strReturn)
brow
FoxPress – Mayo de 2002
© 2002 FoxPress. All rights reserved