VB6 y SOAP
Buenas a todos, para inaugurar este blog voy a empezar con un artículo sobre como consumir servicios web con Visual Basic 6.
Para entrar en materia, explicar que un servicio web es un programa de servidor que pone a disposición de otras aplicaciones una serie de recursos para que estas los puedan aprovechar.
Pongamos por ejemplo que quisiéramos desarrollar un programa que nos muestre estadísticas sobre el clima de nuestro país en los últimos años.
Podríamos programar la interfaz pero, ¿de donde sacaríamos los datos para que funcionase nuestro programa? pues una solución sería buscar un sitio donde se ofrezca el servicio web para que podamos consumirlo como por ejemplo,
http://www.webservicex.net/globalweather.asmx
El ejemplo que voy a exponer no es tan sofisticado pero nos ayudará a entender como funciona.
Como podemos comprobar el lenguaje es independiente en cada caso. He elegido php como podia haber elegido asp o VB6 como java. Lo importante es que el protocolo se abstrae del lenguaje que usemos en cada caso.
WEB SERVICE
Lo primero es programar el web service. Como ya hemos dicho lo vamos a hacer en php y para ello vamos a utilizar NuSOAP que es una libreria de utilidades que nos ayudará a montarlo.
NuSOAP te lo puedes descargar de:
Vamos a hacer una calculadora web service.
Nuestra calculadora tendrá cuatros servicios, cada uno será una operación simple matemática como sumar, estar, etc... Estará escrita en php y colgada en un servidor y después programaremos el cliente que consumirá los servicios de nuestra calculadora y estará escrito en Visual Basic 6.
Una vez descargado lo descomprimes en la carpeta del proyecto. En nuestro ejemplo además hemos renomprado la carpeta y la hemos llamado simplemente lib.
Ahora os expongo el código:
// incluir librerias
require_once('lib/nusoap.php');
$namespace = 'urn:http://www.bakoom.com/webservices/';
Empezamos incluyendo la librearía y guardando en la variable namespace el espacio de nombres que en este caso va a ser la dirección del webservice pero podria ser solo el dominio.
// crear servidor
$server = new soap_server();
$server->configureWSDL('calculadora', $namespace);
$server->wsdl->schemaTargetNamespace = $namespace;
Ahora creamos el webservice con soap_server y configuramos el WSDL.
WSDL son las siglas de web service description language que es un XML que genera el web service que describe los servicios y estructura de datos de nuestra aplicación de servidor para que otros desarrolladores puedan crear aplicaciones clientes capaces de consumir nuestros servicios.
Para configurar el WSDL usaremos el método configureWSDL y le damos como parámetros el nombre del webservice que en este caso será calculadora y como segundo parámetro el namespace.
$server->register(
'suma',
array('dOperando1'=>'xsd:double', 'dOperando2'=>'xsd:double'),
array('return'=>'xsd:double'),
$namespace, // namespace
$namespace.'#suma', // soapaction
'rpc', // style
'encoded', // use
'suma dos valores' // documentation
);
$server->register(
'resta',
array('dOperando1'=>'xsd:double', 'dOperando2'=>'xsd:double'),
array('return'=>'xsd:double'),
$namespace, // namespace
$namespace.'#resta', // soapaction
'rpc', // style
'encoded', // use
'resta dos valores' // documentation
);
$server->register(
'multiplicacion',
array('dOperando1'=>'xsd:double', 'dOperando2'=>'xsd:double'),
array('return'=>'xsd:double'),
$namespace, // namespace
$namespace.'#multiplicacion', // soapaction
'rpc', // style
'encoded', // use
'multiplicación de dos valores' // documentation
);
$server->register(
'division',
array('dOperando1'=>'xsd:double', 'dOperando2'=>'xsd:double'),
array('return'=>'xsd:double'),
$namespace, // namespace
$namespace.'#division', // soapaction
'rpc', // style
'encoded', // use
'división de dos valores' // documentation
);
Después registramos los servicios. Los servicios son las funciones que ponemos a disposición de las aplicaciones.
Para registrar un servico usamos el método register. en el ejemplo está tabulado para que se vean claramente los parámetros que son los siguientes:
- Nombre del servicio.
- Parametros del servicio. Este parametro acepta un array asociativo de pares, nombre de parametro y tipo. El tipo del parámetro se expresa xsd:double para el tipo de doble precisión. Para otros tipos como string sería xsd:string o para enteros xsd:integer.
- Parámetro de retorno: es otro array con un par que se expresa como en el punto anterior.
- Namespace: pues eso.
- Soap Action: aquí contatenamos el namespace con el nombre del servicio.
- style: rcp.
- use: encoded
- documentación: descripción del servicio.
function suma($dOperando1, $dOperando2)
{
return $dOperando1 + $dOperando2;
}
function resta($dOperando1, $dOperando2)
{
return $dOperando1 - $dOperando2;
}
function multiplicacion($dOperando1, $dOperando2)
{
return $dOperando1 * $dOperando2;
}
Ahora declaramos las funciones que hemos registrado antes. Como en este ejemplo estamos haciendo una sencilla calculadora cada funcion retornara el resultado de una operación.
function division($dOperando1, $dOperando2)
{
if($dOperando2 == '0')
return new soap_fault('Client','','División entre 0.');
return $dOperando1 / $dOperando2;
}
Para el caso de la división quiero hacer una mención especial. Cuando dividimos un número entre cero el resultado es... INFINITO!!! por lo que cualquier calculadora nos daría, E.
Conclusión, el segundo parámetro no puede ser cero, por ello debemos detectar el caso y actuar en consecuencia pero los servicios web solo pueden devolver un parámetro del tipo expecificado y en este caso solo podemos devolver un dato del tipo double de modo que para indicar al cliente la condición de error vamos a devolver un objeto de la clase soap_fault con los parámetros:
- Fault code: aquí indicamos CLIENT si el error proviene del cliente o SERVER si el error se produce en el servidor.
- Fault actor: solo usado para ciertos casos
- Fault string: aquí va el mensaje de error que queremos hacer llegar al cliente.
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; //mostrar resultados $server->service($POST_DATA);Por último captamos lo que llege por la variable global HTTP_RAW_POST_DATA y se la pasamos como parámetro al método service y listo.
Ya tenemos un web service.
Si ahora visitamos la dirección que pusimos como namespace, en este caso:
http://www.bakoom.com/webservice/calculadora.php
Aparecerá una mini web que describe los serviciós que publicamos en un formato que los humanos podamos entender.
Si la dirección que ponemos es http://www.bakoom.com/webservice/calculadora.php?wsdl veremos el WSDL que es el XML que describe los servicios a las aplicaciones y los entornos de desarrollo.
APLICACIÓN CLIENTEAhora le toca el turno a la aplicación de sobre mesa. Esta aplicación sera como el interface del web service. En ella introduciremos los datos y esta los enviara al web service donde se calculará el resultado y se lo remitirá de nuevo a la aplicación para que nos lo muestre.
Para nuestro ejemplo vamos a crear un proyecto nuevo de VB y seleccionaremos EXE estandar.
En la barra de menú del entorno seleccionamos Proyecto > Referencias... y se abrirá el formulario referencias.
Del listado de referencias seleccionamos Microsoft Soap Type Library y pulsamos aceptar.
Al formulario le pondremos dos label con las propiedades caption "Operando1 :" y "Operando2 :".
También dos TexBox y cuatro options con los caption "Suma", "Resta", "Multiplicación" y "División".
Por último añadimos un Command y hacemos doble click sobre el para programar el evento click.
El código es el siguiente:
Private Sub Command1_Click()
Dim soapObject As New SoapClient
On Error GoTo Error
soapObject.mssoapinit "http://www.bakoom.com/webservice/calculadora.php?wsdl"
'si se está sumando...
If Option1.Value Then
MsgBox soapObject.suma(CDbl(Text1.Text), CDbl(Text2.Text))
Else
'si se está restando...
If Option2.Value Then
MsgBox soapObject.resta(CDbl(Text1.Text), CDbl(Text2.Text))
Else
'si se está multiplicando...
If Option3.Value Then
MsgBox soapObject.multiplicacion(CDbl(Text1.Text), CDbl(Text2.Text))
Else
'si se está dividiendo...
If Option4.Value Then
MsgBox soapObject.division(CDbl(Text1.Text), CDbl(Text2.Text))
End If
End If
End If
End If
Error:
If Err.Number <> 0 Then
MsgBox Err.Description
End If
End Sub
El código empieza creando un objeto de la clase SoapClient. Despues con On Error goto error indicamos que de producirse un error, el flujo de ejecución vaya a la etiqueta error.
soapObject.mssoapinit "http://www.bakoom.com/webservice/calculadora.php?wsdl"Al método mssoapinit le pasamos la dirección del web service en la que se mostraría el WSDL.
De esta forma el objeto soapObject reconoce los servicios que podremos utilizar.
Ahora para usar los servicios del web service los llamaremos en la programación como si fuesen métodos de soapObject con los mismos parámetros con los que los diseñamos en el web service siendo transparente para nosotros el proceso de comunicación entre la aplicación cliente y la aplicación de servidor. Despues de esto hay una serie de bloques if anidados que comprueban que operación matemática es la que queremos usar y dependiendo del option que hayamos seleccionado y para cada uno llama a un servicio distinto pasandole los valores de los textBox como parámetros.
El resultado devuelto por el webservice es sacado directamente en un msgbox.
Si como digimos antes, probocásemos un error de cálculo intentando dividir un número entre cero, el web service enviará un objeto soap_fault que el VB6 interpretará como un error de la aplicación que nosotros hemos recodigo enviando el flujo de ejecución a la etiqueta error que en este caso es un msgbox que nos muestra el mensaje de error.
Y esto es todo por hoy. Espero que os sirva. Un saludo.



Comentarios
soapObject.resta(Array)
Saludos y gracias por la informacion esta muy buena de verdad..