Por Alberto Rodríguez consumir.zip
Cuando Microsoft introdujo la Automatización Remota,
los programadores fueron introducidos en la idea de separar las aplicaciones en
múltiples capas y realizar la comunicación entre las capas mediane la
Automatización Remota. Este proceso fue formalizado y posteriormente incluido
en Windows mediante la tecnología DCOM. Ambas tecnologías te permiten
conectarte a un proceso en una máquina remota y comunicarte con ese proceso
remoto.
Sin embargo, el problema es que el proceso de determinar la
máquina remota y los mecanismos de comunicación son windows-céntricos. Cuando
intentas construir servicios que realicen las funciones de la capa intermedia
en Internet te encuentras con problemas en los protocolos, autenticación y
otras cuestiones. Los Servicios Web extienden el paradigma multi-capa a la Web
y abren sus acciones a otros sistemas operativos.
¿Qué es un servicio Web?
Los Servicios Web
usan los conocidos URI para identificar los host y servicios que quieres
invocar. El método que deseas invocar y los parámetros que pasas a ese método
se expresan como parte de la URL o encapsulada en un fragmento XML mediante el
protocolo SOAP. Los resultados se devuelven al que lo ha pedido mediante XML.
Este esquema tiene miles de ventajas y entre otros que
cualquier plataforma es capaz de solicitar una página Web, leer los resultados
e interactuar con este servicio.
Los Servicios Web son
la próxima generación de aplicaciones Web. Son modulares, se autodescriben y pueden ser invocadas y publicadas desde
cualquier punto de la web. Los Servicios Web pueden ser desde simples funciones
o métodos hasta complejos procesos de negocio.
Una forma sencilla de
entender lo que es un servicio web es pensar lo que un cibernauta hace cuando
quiere un hotel en otra ciudad. Normalmente suele ir un buscador y poner las
palabras: “HOTEL Cordoba” y a través de ahí irse acercando a las páginas de los
hoteles que más le interesen.
Con un Servicio Web
de reserva de hoteles bastaría con que existiera una función de búsqueda que
tuviera un parámetro con el nombre de la ciudad y ya está.
Un ejemplo, por favor....
En nuestro caso vamos a consumir un servicio que
está en la Web y que es el traductor Babelfish. Lo vamos a hacer de dos formas.
Implementación 1
Esta implementación necesita que esté
instalado el soporte SOAP que lo tienes en http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/580/msdncompositedoc.xml
y en los ficheros del mes. (Sobre SOAP ya se ha hablado en los números anteriores
de esta revista)
Este kit seguramente ya viene integrado en
VFP 7 o estará disponible en el CD de este producto.
Una vez instalado
escribe un programita con lo siguiente:
LOCAL x
x = CREATEOBJECT("MSSOAP.SoapClient")
x.MSSoapInit("http://www.xmethods.net/sd/2001/BabelFishService.wsdl",;
"BabelFishService","","")
? x.babelfish('en_es','a Fox is near you')
Y verás la respuesta...
Seguramente tu imaginación ya está empezando a volar... pero si esto lo hacemos un poco más sofisticado podemos hacernos un formulario con ese código y he aquí la traducción que BabelFish me propone para las primeras letras de la vieja canción de Bob Dylan Hard Times in New York Town del año 1961
La tradución no es muy ajustada pero este tema no es el que nos interesa ahora.
Implementación 2
Esta
implementación es un poco más laboriosa que la anterior pero sirve para
entender un poco más todo el movimiento que se está produciendo detrás de los
escenarios.
Esta
vez necesitamos tener instalado el
último Parser XML de MS (en los ficheros del mes te adjunto el Parser
3.0SP1 aunque en el momento de escribir estas líneas ya estaba bastante
avanzado el Parser 4.0). La Web de
Microsoft donde están estos Parsers es: http://msdn.microsoft.com/downloads/default.asp?URL=/downloads/sample.asp?url=/msdn-files/027/001/591/msdncompositedoc.xml
Igual
que antes vamos a usar el Servicio Web llamado BabelFish que se encuentra
domiciliado en http://www.xmethods.net/detail.html?id=14
. (una especie de central de Servicios) Ahí es donde nos describe su
funcionalidad y la forma de usarlo.
La información que nos da es:
Descripcion: |
Interface for AltaVista's Babelfish
service. |
SOAP Endpoint URL: |
http://services.xmethods.net:80/perl/soaplite.cgi |
SOAPAction: |
urn:xmethodsBabelFish#BabelFish |
Method Namespace URI: |
urn:xmethodsBabelFish |
Method Name(s): |
BabelFish |
WSDL URL: |
http://www.xmethods.net/sd/2001/BabelFishService.wsdl
|
Instructions: |
METHOD: BabelFish INPUT : translationmode(xsd:string) sourcedata (xsd:string) OUTPUT return (xsd:string) translationmodes are listed below. sourcedata is the text to be translated. result is the translated data. Translation translationmode ----------- ---------------- English -> French "en_fr" English -> German "en_de" English -> Italian "en_it" English -> Portugese "en_pt" English -> Spanish "en_es" French -> English "fr_en" German -> English "de_en" Italian -> English "it_en" Portugese -> English "pt_en" Russian -> English "ru_en" Spanish -> English "es_en" |
¡¡Muy bien, ahora a escribir el código!! Si eres un inquieto ya estarás nervioso por no ver el código pero si
eres más reflexivo estarás diciendo: ¡un momento, un momento, que me expliquen que significa todo eso de
SOAP Endpoint URL, Method Namespace URI, etc... Esta vez vamos a contentar a los inquietos y a los
reflexivos los mandaremos a que se repasen los articulos sobre SOAP del mes pasado y anterior.
Sigamos, entonces queremos escribir ¡ya! El código:
Pues aquí está:
CLEAR
oHTTP = create('MSXML2.XMLHTTP')
*************-Creamos el Sobre - ************
*- Cabecera SOAP
strPaquete = '<SOAP:Envelope
xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">'
strPaquete = strPaquete + '<SOAP:Header></SOAP:Header>'
*-Cabecera Body
strPaquete = strPaquete + '<SOAP:Body>'
*- Nombre del Método
strPaquete = strPaquete + '<m:BabelFish xmlns:m="urn:xmethodsBabelFish">'
*- Nombre de la propiedad pasada como parámetro
strPaquete = strPaquete + '<translationmode>en_es</translationmode>'
strPaquete = strPaquete + '<sourcedata>Fox</sourcedata>'
strPaquete = strPaquete + '</m:BabelFish>'
strPaquete = strPaquete + '</SOAP:Body></SOAP:Envelope>'
oHTTP.open("post", "http://services.xmethods.net:80/perl/soaplite.cgi", .F.)
oHTTP.setRequestHeader("Content-Type", "text/xml")
*-Decimos qué objeto queremos instanciar y qué método y en qué lugar está
oHTTP.setRequestHeader("SOAPAction", "urn:xmethodsBabelFish#BabelFish")
oHTTP.send(strPaquete)
strReturn = oHTTP.responseText
? strReturn
El código es una adaptación del que se publicó el mes pasado y lo que unicamente se hace es
adaptarlo a los requerimientos de este Servicio Web.
Al ejecutarlo me devuelve una cadena en la que veo que me ha traducido Fox por Zorro.
Si quieres más información sobre la creación y uso de servicios web puedes mirarte:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfoxgen7/html/vfpws.asp que
aunque está más adaptado a VFP 7.0 se puede incorporar con mínimos cambios a VFP 6.0
FoxPress – Septiembre de
2001
© 2001 FoxPress. All rights reserved