FoxPress – Mayo 2002

 

Acceder a GOOGLE por SOAP

 

http://www.fpress.com/                                                                                         

 

 

          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