Los servicios en Internet están tomando cada vez más importancia. Se diseñan como "cajas negras" que oculten la complejidad de los sistemas finales y permitan una fácil comunicación. Sin embargo es fundamental tener un medio de localizar esos servicios, tarea más difícil conforme crece el número de servicios disponibles.

La especificación UDDI simplifica esa tarea, permitiendo a una organización publicar información sobre los servicios que ofrece y localizar información sobre servicios web que necesita utilizar.
UDDI es simplemente un repositorio de documentos XML (y un esquema) que define un mensaje SOAP para el registro y petición de información.
Los documentos XML (datos guardados en el sistema UDDI) son hospedados por compañías que aceptan mantener un nodo y siguen la especificación dada por el consorcio UDDI.org. Actualmente Microsoft e IBM mantienen nodos públicos que siguen la especificación de versión 1, y Hewlett-Packard hospedará un nodo de versión 2.
Un fichero de registro es un documento XML-UDDI con tres partes principales:
UDDI es un sistema ideado para describir servicios (junto con WSDL) y localizar empresas que ofrezcan estos servicios.
UDDI puede ayudarnos a resolver los siguientes problemas:
Un ejemplo de cómo se podría usar sería el siguiente: supongamos que se creara un estándar UDDI para reserva y venta de billetes de avión. Las aerolíneas podrían registrar sus servicios en un directorio UDDI siguiendo ese estándar (e interface UDDI). Así, las agencias de viaje, accediendo al repositorio UDDI a través de la interfaz, podrían comunicarse con el servicio ofrecido por cualquier aerolínea para hacer las reservas y ventas.
El primer paso es decidir cómo modelar la compañía y sus servicios en UDDI. Para ello, han ideado el concepto de tModels (modelos tecnológicos) que representan las interfaces, abstracciones técnicas y metadatos del servicio. Como vemos, es lo que dijimos que hacía el lenguaje WSDL; no en vano, UDDI utiliza WSDL como tModel (aunque podría utilizar otros).
Así pues, lo primero que hay que hacer es determinar los tModel o ficheros WSDL para nuestro servicio. Si el servicio está basado en un fichero WSDL que ya está registrado, entonces sólo necesitamos saber la URL hasta ese fichero y el identificador que le asignó UDDI al registralo anteriormente. Si el servicio está basado en un fichero WSDL no registrado, deberemos registrarlo previamente.
Durante el proceso de registro hay que saber las categorías e identificadores de la empresa de acuerdo a las clasificaciones del North American Industry Classfication System, Universal Standard Products and Services Codes, ISO 3166, Standard Industry Classification, y GeoWeb Geographic Classification.
Habrá que decidir también qué nivel de seguridad necesitamos. Una vez que tengamos modelada la empresa y los servicios, obtendremos una cuenta en el sistema de registro UDDI a través del sistema web.
La búsqueda de servicios consiste en localizar descripciones de servicios en WSDL registrados en UDDI. En ese proceso, los clientes web pueden determinar qué tipos de servicios existen, qué pueden hacer, y cómo interaccionar con ellos.
UDDI permite acceder al servicio de localización mediante una interfaz de programa (veremos cómo hacerlo con UDDI::Lite y con C#) o mediante una interfaz web.
Básicamente, UDDI permite dos acciones: pedir información y publicar información. Cada acción podemos llevarla a cabo mediante ciertos métodos:
|
|
Una descripción más detallada de estas interfaces se encuentra en http://www.uddi.org/pubs/DataStructure-V1.00-Open-20000930_2.pdf
El funcionamiento es a través de mensajes SOAP con el contenido apropiado para llamar al método correspondiente. Por ejemplo, si queremos buscar la empresa ZZ, enviaríamos el siguiente XML en el cuerpo del mensaje SOAP:
<find_business generic="1.0" xmlns='urn:uddi-org:api'>
<name>ZZ</name>
</find_business>
El mensaje SOAP devuelto contendrá las empresas que contengan "ZZ" en su nombre y los servicios registrados (llega en una estructura XML llamada businessInfos).
Veamos cómo acceder al sistema de búsqueda mediante la interfaz web.

Es una colección de módulos Perl que ofrecen una interfaz simple para acceder a los servicios UDDI. Las principales características son:
new() crea un objeto de clase UDDI::Lite. Es un método opcional.
proxy() especifica la URL final y el módulo al que se accederá mediante llamadas SOAP.
namespace() permite especificar el espacio de nombres. Es opcional (si no se usa, el espacio de nombres será SOAP-ENV).
on_fault() especifica un manejador que se usará en caso de que se produzca un error. Por defecto se aborta el programa.
on_debug() especifica un manejador que se usará en caso de que queramos depurar el programa. Por defecto se ignora.
En este ejemplo, debemos hacer uso de la librería UDDI::Lite. A continuación debemos indicar con el método proxy() de la clase, cuál es el servidor y camino completo hasta el servicio UDDI que vamos a utilizar. En este caso, vamos a acceder al servicio de búsqueda de empresas que ofrece Microsoft. En el código que sigue, podemos ver cómo utilizamos diversas funciones (ofrecidas por el objeto que devuelve la llamada al servicio find_business()) para acceder a cada parte de la información que nos devuelve.
El código que podría hacer esas peticiones sería:
#!/usr/bin/perl -w
use UDDI::Lite;
print "\n";
print UDDI::Lite
->proxy('http://test.uddi.microsoft.com/inquire')
->find_business( name => 'old' )
->result
->businessInfos
->businessInfo
->serviceInfos
->serviceInfo
->name;
print "\n";
Podemos hacerlo un poco más completo (y complejo) para acceder a toda la información que nos devuelve:
#!/usr/bin/perl -w
use UDDI::Lite;
my $uddi = UDDI::Lite
->proxy('http://test.uddi.microsoft.com/inquire');
my $list = $uddi->find_business( name => 'xmethods' );
my $bis = $list->businessInfos;
for ( $bis->businessInfo ) {
my $s = $_->serviceInfos->serviceInfo;
print $s->name," ",$s->businessKey,"\n";
}
Veamos cómo programar un cliente UDDI para acceder al servicio de localización de información en C#.
using Microsoft.Uddi;
using Microsoft.Uddi.Api;
try {
//acceso al nodo UDDI
Inquire.Url = "http://uddi.microsoft.com/inquire";
//objeto para buscar empresas
FindBusiness fb = new FindBusiness();
fb.Name = "Microsoft";
//enviar la búsqueda
BusinessList bizList = fb.Send();
Console.WriteLine( Businesses found: "+
bizList.BusinessInfos.Count.ToString() );
} catch (UddiException e) {
Console.WriteLine( "UDDI exception: "+e.Number+" "+e.Message );
} catch (Exception e) {
Console.WriteLine( "General exception: "+e.Message );
}
Para registrar servicios podemos utilizar una librería de Microsoft (que utilizaremos en Visual Basic) o bien podemos optar por el intercambio "a pelo" de mensajes SOAP...
Esta librería podemos bajarla de http://www.microsoft.com/downloads/release.asp?ReleaseID=24822 o bien desde la copia local que tenemos en ./ms_uddi/
Como comentamos al principio, debemos habernos dado de alta en el sistema de registro del nodo de Microsoft para conseguir un nombre de usuario y clave.
Una vez tengamos esto, podemos utilizar Visual Basic para crear un aplicación similar a la de la siguiente figura:

También podemos bajarla directamente desde el siguiente enlace: aplicación VB (incluye los ficheros de proyecto para VBasic y el código que sigue).
El código asociado a la aplicación es el siguiente:
Dim saveMsg As New save_business Dim busDet As New businessDetail Dim ReqEnv As New UddiEnv.Envelope Dim ResEnv As UddiEnv.Envelope Dim Req As New UddiEnv.RequestManager Dim busEnt As UDDI10.businessEntity Dim busServ As UDDI10.businessService Dim bindTempl As UDDI10.bindingTemplate Dim model As UDDI10.tModelInstanceInfo Req.tracePath = "C:\Temp\UDDITrace\publish\" Req.trace = True Req.Mode = test Req.Authenticate txtUser.Text,txtPWD.Text If Req.UDDIErrno = 0 Then txtStatus.Text = "Authentication successful" Else txtStatus = "Error in authentication. Error text is: " & Req.UDDIErrorText Exit Sub End If DoEvents Set ReqEnv.Plugin = saveMsg Set busEnt = saveMsg.AddbusinessEntity busEnt.Name = txtCompName.Text busEnt.AddDescription = txtDescr.Text Set busServ = busEnt.businessServices.AddBusinessService busServ.Name = txtServiceName.Text busServ.AddDescription = txtServiceDescr.Text Set bindTempl = busServ.bindingTemplates.AddBindingTemplate bindTempl.accessPoint = txtAccessURL.Text bindTempl.AddDescription = txtBindingDescr.Text Set model = bindTempl.tModelInstanceDetails.AddtModelInstanceInfo model.tModelKey = txttModelKey.Text Set ResEnv = Req.UDDIRequest(ReqEnv) If Req.UDDIErrno = 0 Then Set ResEnv.Plugin = busDet busKey = busDet.businessEntity.Item(1).businessKey txtStatus.Text = "Plublised successfully. Bus Key is: " & busKey Else txtStatus = "Error in authentication. Error text is: " & Req.UDDIErrorText End If Req.End_Session