En las entregas anteriores de esta mini-serie vimos cómo crear un servicio Web con Visual Basic 6 sin necesidad de hacer nada especial, sólo crear una DLL normal y corriente.

Una vez suplida esta necesidad todavía nos queda otra: poder consumir servicios Web en Windows sin necesidad de programar en .NET.

Sorprendentemente se trata de un tarea muy sencilla, si bien tiene sus limitaciones al intentar usarlo con servicios Web complejos que constan de varios componentes o espacios de nombres.

La técnica consiste en el uso de la conocida función GetObject, si bien usando una sintaxis algo especial. Este función está disponible en Visual Basic, VBScript, Windows Scripting Host, etc… por lo que podemos hacer uso de ella universalmente.

Por ejemplo, el siguiente código de WSH (guárdalo con cualquier nombre y extensión ‘.vbs’ o incluso úsalo desde una página HTML), utiliza el servicio Web de información horaria que creamos en la anterior entrega para devolver la hora en el servidor:

Dim oHora
set oHora = GetObject("soap:wsdl=http://localhost/horaws/PruebaSOAP.Hora.soap?WSDL")
msgbox oHora.HoraLocal

¡Facilísimo!. Lo único que hay que hacer es colocar la URL del descriptor del servicio Web (archivo WSDL) como parámetro de GetObject, precediéndolo con la expresión 'soap:wsdl'. Se creará automáticamente un objeto COM con los métodos expuestos por el servicio Web que podremos usar como si fuera local. ¡Impresionante!.

Al igual que antes, lo que ocurre por detrás es que se genera automáticamente código .NET Remoting que se compila en una DLL .NET que es la que hace el trabajo por detrás para comunicarse con el servicio Web. La primera vez que se hace una llamada al servicio Web ésta tarda un par de segundos mientras se compila el componente, pero todas las sucesivas llamadas, al existir ya el Proxy, se realizan a toda velocidad, por lo que sólo dependeremos de la velocidad de nuestra conexión.

La DLL generada (y el archivo de código fuente a partir del cual se generó) la podemos encontrar en la carpeta 'C:\WINDOWS\system32\Com\SOAPAssembly', por lo que incluso la podremos utilizar tal cual o recompilarla en nuestros desarrollos .NET también.

Pero todavía falta lo mejor: esta técnica funciona para cualquier servicio Web, no sólo para los generados con el sistema que hemos aprendido. Si disponemos de un servicio Web creado con .NET, Java, Gluecode o cualquier otro sistema compatible con SOAP, podemos consumirlo a través de GetObject. Esto es así en la mayor parte de las ocasiones, ya que existen ciertas limitaciones si el servicio expuesto es muy complejo.

Por ejemplo, si copias el siguiente código a un archivo ‘.vbs’ dispondrás de un programa que te permite verificar la disponibilidad de un dominio ‘.com’, ‘.org’ o ‘.net’ utilizando el servicio Web gratuito que tiene para esta tarea XMethods:

Dim sDominio
sDominio = InputBox("Dominio a verificar (sin 'wwww')", "Verificador de dominios")

If sDominio <> "" Then
   Dim oDC
   set oDC = GetObject("soap:wsdl=http://services.xmethods.net/soap/urn:xmethods-DomainChecker.wsdl")
   MsgBox oDC.checkDomain(sDominio)
End If

Este código te pregunta un nombre de dominio (por ejemplo, JASoft.org) y devuelve la cadena "Available" o "Unavailable" en función de su disponibilidad. Más sencillo imposible.

Sigue sintonizado a esta miniserie. Todavía me quedan unas cuantas cosas por explicar al respecto. Por ejemplo, ¿cómo podemos hacer que los objetos COM que exponemos mediante SOAP  se comporten como objetos sin estado o con estado para conservar la conexión con los clientes?

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA