versione italiana versione italiana
english version english version

Web Services: Technology Overview (Parte 3/3)

Universal Description, Discovery and Integration (UDDI)
Rimane un ultimo problema da risolvere e poi saremo in grado di lavorare comodamente sfruttando i servizi Web esposti sulla rete Internet: chi ci dice chi espone dei servizi e quali sono questi servizi ? Se ho bisogno di invocare un servizio che mi fornisca l’ora esatta, l’oroscopo, le previsioni del tempo, ecc. come faccio a sapere chi me lo offre ? Come posso confrontare le proposte sul mercato e scegliere quella che più si adatta alle mie esigenze e, perchè no, al mio budget di spesa ? Quando navighiamo in Internet e cerchiamo delle informazioni su un argomento, per esempio su SOAP, come ci muoviamo di solito ? Navighiamo sul nostro motore di ricerca “di fiducia”, scriviamo SOAP nella casella di testo e premiamo il pulsante “Cerca !”. Ecco la lista dei risultati a nostra disposizione. Sarebbe interessante poter usufruire di servizi analoghi anche per cercare un Web Service. Nel nostro caso potremmo scrivere “previsioni del tempo” o “oroscopo on-line” ed ecco comparire la lista dei servizi disponibili. Ebbene tutto questo, seppur con una dinamica leggermente diversa, è possibile. È stato infatti elaborato un meccanismo di registrazione e di consultazione di un archivio di servizi, pensato appositamente per la ricerca di Web Service sulla rete, o sulla Intranet aziendale. Stiamo parlando di Universal Description, Discovery and Integration (UDDI).
Si tratta di un insieme di funzioni che permettono di:
  • Registrare aziende, servizi e informazioni per raggiungere i servizi stessi
  • Modificare o cancellare le registrazioni
  • Ricercare il database delle registrazioni
Operativamente un’azienda che vuole rendere disponibile un Web Services dovrà:
  • Registrarsi come azienda in quanto tale
  • Registrare il servizio offerto da un punto di vista descrittivo
  • Registrare le informazioni necessarie ad invocare il servizio, come per esempio la URL presso cui è esposto
Queste informazioni sono spesso raggruppate in tre categorie: pagine bianche (business), pagine gialle (service), pagine verdi (technical infos).

[Immagine 2: Rappresentazione grafica del registry UDDI.]
 
Un client che voglia usufruire di un servizio potrà quindi ricercare una di queste voci o eseguire una ricerca su più livelli. Per esempio potremmo cercare tutte le aziende che vendono servizi di una determinata categoria, oppure cercare i servizi offerti da una certa azienda di cui ci fidiamo particolarmente. Ciò che conta è che, al termine di una ricerca completa, avremo ottenuto i dettagli tecnici necessari per invocare il servizio(per esempio la URL del file WSDL, se disponibile). Affinchè tutto questo processo diventi concreto manca ormai una sola ed ultima informazione: come si utilizza UDDI ? Forse la risposta a questa domanda era prevedibile: UDDI è esposto sulla rete Internet ed è raggiungibile sotto forma di Web Service ! Se vogliamo quindi cercare un Web Service dovremo almeno conoscere un Web Service UDDI di cui ci fidiamo e rivolgere a quest’ultimo le nostre richieste. Diverse aziende espongono, anche sul Web, motori di ricerca sui loro registry UDDI. Il database UDDI infatti non è uno ed unico al mondo, chiunque voglia può organizzare il proprio motore di ricerca ed il proprio business registry UDDI, nel rispetto delle raccomandazioni di chi ha creato UDDI stesso (http://www.uddi.org/). Le aziende che appoggiano e supportano UDDI (http://www.uddi.org/community.html) hanno concordato di replicare i loro database, in modo tale da fornire gli stessi record agli utenti. Potremmo inoltre pensare di organizzare nella nostra Intranet aziendale un registry UDDI per i servizi interni. Windows .NET Server, per esempio, fornirà un servizio di sistema per la gestione di un business registry UDDI.
 

[Immagine 03: Alcuni dei motori di ricerca UDDI e il sito web ufficiale di UDDI.]
 
Vediamo quindi, per completezza, come si può presentare una ricerca in un registry UDDI dal punto di vista dei messaggi SOAP che vengono scambiati. All’interno di un business registry UDDI abbiamo quattro categorie di informazioni, che per UDDI sono tipi di dati:
  • businessEntity: fornisce informazioni non tecniche su una realtà o un’azienda che espone dei servizi, a prescindere da quali siano questi servizi (pagine bianche)
  • businessService: fornisce informazioni non tecniche (descrizione, prezzo, ecc.) relativamente a servizi esposti dalle businessEntity (pagine gialle)
  • bindingTemplate: fornisce informazioni tecniche (specifiche, entry point, ecc.) riguardo ai servizi (pagine verdi)<(LI>
  • tModel: specificano i dettagli di interfacciamento verso un determinato servizio e dipendono dai bindingTemplate (pagine verdi)
Questi tipi di dati sono identificati univocamente all’interno dei registry tramite delle chiavi uuid_key che non sono altro che dei GUID (Global Unique IDentifier). La loro struttura è descritta da XML Schema ottenibili dal sito web di UDDI (http://www.uddi.org/).

[Immagine 04: Struttura dati di un registry UDDI e azioni possibili.]
 
Le funzioni API che abbiamo a disposizione in UDDI appartengono a diverse categorie:
  • Inquiry API - per la ricerca di informazioni e servizi:
FunzioneSignificato
find_binding Restituisce zero o più bindingTemplates associati ad un certo businessService
find_business Restituisce una businessList, che è una lista di businessEntity
find_relatedBusinesses Fornisce una lista di businessEntity associate ad una determinata altra businessEntity
find_service Restituisce un businessService
find_tModel Restituisce uno o più tModel associati ad un certo bindingTemplate sotto forma di tModelList
get_bindingDetail Restituisce un particolare bindindDetail, contenente dei bindingTemplate
get_businessDetail Restituisce un particolare businessDetail, contenente delle businessEntity
get_businessDetailExt Restituisce un particolare businessDetailExt, cioè delle informazioni estese su delle businessEntity
get_serviceDetail Restituisce un particolare serviceDetail, contenente dei businessService
get_tModelDetail Restituisce un particolare tModelDetail, contenente dei tModel
  • Publishing API - per la pubblicazione di informazioni e servizi:
FunzioneSignificato
add_publisherAssertions Inserisce nel registry una richiesta di aggiunta di una relazione tra due businessEntity
delete_binding Cancella un bindingTemplate
delete_business Cancella una businessEntity
delete_publisherAssertions Cancella una relazione tra due businessEntity
delete_service Cancella un businessService
delete_tModel Cancella un tModel
discard_authToken Equivale ad una sorta di log-off nei confronti di un site di UDDI Registry
get_assertionStatusReport Ottiene lo stato di una relazione (completata o meno) tra due businessEntity
get_authToken Equivale ad eseguire il log-on nei confronti di un site di un UDDI Registry. Il token che si ottiene deve essere utilizzato durante tutte le altre operazioni di Publishing
get_publisherAssertions Ottiene la lista delle relazioni in cui è coinvolta la businessEntity corrente
get_registeredInfo Permette di avere una breve lista delle businessEntity e dei tModel associati all’utente correntemente connesso, in base al suo token
save_binding Registra un nuovo bindingTemplate
save_business Registra una nuova businessEntity
save_service Registra un nuovo businessService
save_tModel Registra un nuovo tModel
set_publisherAssertions Aggiorna/sostituisce le relazioni della businessEntity corrente

 
Se volessimo schematizzare un’interrogazione UDDI, che veda la società Scarpe S.r.l. ricercare dei servizi esposti dalla società Suole S.p.A. avremo:
  • Ricerca di un’entità business di nome “Suole S.p.A.”:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
       <find_business generic="1.0" xmlns="urn:uddi-org:api">
           <name>Suole S.p.A.</name>
</find_business>
</soap:Body>
</soap:Envelope>

  • Risposta da parte del server UDDI tramite una businessList:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
       <businessList generic="1.0" operator="Microsoft Corporation" truncated="false" xmlns="urn:uddi-org:api">
           <businessInfos>
               <businessInfo businessKey="1a52c034-9d09-4fc0-b1c4-c41f20ec9a51">
                   <name>Suole S.p.A.</name>
                   <description xml:lang="it"> Fabbrica di suole per scarpe </description>
                   <serviceInfo serviceKey="1fa53d19-c7f9-41ef-aa7b-0d1f23b635b1" businessKey="1a52c034-9d09-4fc0-b1c4-c41f20ec9a51">
                       <name>Servizio per ordinare suole</name>
</serviceInfo>
</businessInfo>
</businessInfos>
</businessList>
</soap:Body>
</soap:Envelope>

  • Ricerca dei dettagli realitivi al servizio esposto da “Suole S.p.A.”:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
       <get_serviceDetail generic="1.0" xmlns="urn:uddi-org:api">
           <serviceKey> 1fa53d19-c7f9-41ef-aa7b-0d1f23b635b1 </serviceKey>
</get_serviceDetail>
</soap:Body>
</soap:Envelope>

  • Risposta da parte del server UDDI tramite un serviceDetail:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
       <serviceDetail generic="1.0" operator="Suole S.p.A." truncated="false" xmlns="urn:uddi-org:api">
           <businessService serviceKey="1fa53d19-c7f9-41ef-aa7b-0d1f23b635b1" businessKey="1a52c034-9d09-4fc0-b1c4-c41f20ec9a51">
               <name>Servizio per ordinare suole</name>
               <description xml:lang="it"> Questo servizio permette di ordinare suole di scarpe direttamente via Internet tramite un comodo Web Service </description>
               <bindingTemplates>
                   <bindingTemplate serviceKey="1fa53d19-c7f9-41ef-aa7b-0d1f23b635b1" bindingKey="c64817b8-ffd2-4c13-94bd-09a2ccd4fbf8">
                       <description xml:lang="en"></description>

                       <accessPoint URLType="http">http://www.suole.com</accessPoint>
                       <tModelInstanceDetails>
                           <tModelInstanceInfo tModelKey="uuid:68de9e80-ad09-469d-8a37-088422bfbc36">
                               <description xml:lang="en"> HTTP Address </description>
</tModelInstanceInfo>
</tModelInstanceDetails>
</bindingTemplate>
</bindingTemplates>
</businessService>
</serviceDetail>
</soap:Body>
</soap:Envelope>

  • Richiesta del tModel di un servizio:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
       <get_tModelDetail generic="1.0" xmlns="urn:uddi-org:api">
           <tModelKey> uuid:68de9e80-ad09-469d-8a37-088422bfbc36 </tModelKey>
</get_tModelDetail>
</soap:Body>
</soap:Envelope>

  • Risposta del tModel da parte del server UDDI:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
       <tModelDetail generic="1.0" operator="Microsoft Corporation" truncated="false" xmlns="urn:uddi-org:api">
           <tModel tModelKey="uuid:297aaa47-2de3-4454-a04a-cf38e889d0c4" operator="www.ibm.com/services/uddi" authorizedName="IBM UDDI Publishing Authority">
               <name>Servizio per ordinare suole</name>
               <overviewDoc>
                   <overviewURL> http://www.suole.com/wsOrdini/overview.htm </overviewURL>
</overviewDoc>
</tModel>
</tModelDetail>
</soap:Body>
</soap:Envelope>

A questo punto il client ha tutti gli elementi necessari per raggiungere autonomamente il servizio scelto e quindi invocarlo.
 

[Immagine 05: Interazione client/server UDDI per la ricerca di un servizio.]