Universal Description Discovery and Integration


  1. Introducción

    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:

    Características de UDDI

    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.



  2. Registrando servicios

    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.



  3. Usar servicios. Buscar servicios

    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:

    métodos de búsqueda
    find_business
    find_service
    find_binding
    find_tModel
    métodos de publicación
    save_business
    save_service
    save_binding
    save_tModel
    delete_business
    delete_service
    delete_binding
    delete_tModel

    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.




  4. UDDI::Lite. Librería de Perl para hacer clientes UDDI

    Es una colección de módulos Perl que ofrecen una interfaz simple para acceder a los servicios UDDI. Las principales características son:

    Clases y métodos de UDDI::Lite

    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.

    Ejemplo de cliente UDDI

    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";
    

    Bajar código

    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";
    }
    

    Bajar código

    Cliente UDDI en C#

    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 );
    }
    

    Bajar código



  5. Registrar servicios. Microsoft UDDI SDK

    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
    

    Bajar código