Accedere ai servizi Web da dispositivi wireless

Come ho discusso nella prima colonna Java wireless , "Java si prepara per i servizi Web wireless", la capacità di elaborazione XML rappresenta uno dei requisiti chiave per le applicazioni dei servizi Web wireless. Tuttavia, la specifica standard J2ME / MIDP (Java 2 Platform, Micro Edition / Mobile Information Device Profile) manca di API XML standard, che non sono incluse nemmeno nella prossima specifica MIDP 2.0. Pertanto, abbiamo bisogno di librerie J2ME / CLDC (Connected Limited Device Configuration) di terze parti in grado di gestire XML, in particolare quei protocolli XML specifici dei servizi Web.

In questo articolo, discuto come elaborare i messaggi dei servizi Web utilizzando il pacchetto kSOAP open source sulla piattaforma J2ME / MIDP. Come molte altre architetture di elaborazione aziendale, i servizi Web coinvolgono sia i client che i server. Poiché molte discussioni si concentrano su come utilizzare J2EE (Java 2 Platform, Enterprise Edition) per sviluppare e distribuire servizi Web sul lato server, in questo articolo mi concentro solo sul lato client J2ME.

Il vantaggio SOAP

Un protocollo XML importante per l'accesso ai servizi Web è SOAP (Simple Object Access Protocol). Rispetto alle tecnologie concorrenti, SOAP presenta i seguenti vantaggi:

  1. SOAP definisce più di 40 tipi di dati standard tramite XML Schema e consente agli utenti di definire in modo personalizzato tipi di dati complessi. Questo sofisticato supporto per i tipi di dati rende SOAP un linguaggio potente e ricco per lo scambio di informazioni tra i sistemi orientati agli oggetti oggi ampiamente distribuiti.
  2. Oltre al forte supporto del tipo di dati, SOAP supporta anche vari schemi di messaggistica. Tali schemi includono chiamate di procedura remota sincrone (RPC), messaggistica asincrona, messaggistica multicast (sottoscrizione) e route di messaggi complessi con più intermediari.
  3. Poiché SOAP ha ottenuto il supporto principale come standard di messaggistica dei servizi Web, la maggior parte degli altri protocolli dei servizi Web deve interagire o collegarsi con SOAP. Ad esempio, WSDL (Web Services Description Language), UDDI (Universal Description, Discovery, and Integration) e la maggior parte dei registri XML supportano SOAP; Firma digitale XML, crittografia XML, SAML (Security Assertion Markup Language) e altri protocolli XML protetti forniscono tutti l'associazione standard con SOAP. Ogni protocollo di associazione fornisce la sintassi del proprio elemento speciale all'interno dei messaggi SOAP. Il pieno supporto di SOAP per gli spazi dei nomi XML ha reso facile il collegamento con altri protocolli.

A causa dei vantaggi di cui sopra, SOAP è già il protocollo di comunicazione più utilizzato per i servizi Web. Quindi, un requisito fondamentale per un'applicazione di servizio Web wireless è la capacità di comprendere i messaggi SOAP. Ora diamo un'occhiata ad alcuni semplici esempi SOAP. Il listato 1 illustra un messaggio SOAP semplice e generico:

Listato 1. Messaggio Hello World SOAP

  Ciao mondo   

SOAP è ampiamente utilizzato negli RPC dei servizi Web. Un messaggio di risposta SOAP da un RPC di servizi Web di solito contiene i valori restituiti all'interno di un Resultelemento sotto l' Bodyelemento SOAP . Il Listato 2 mostra un semplice messaggio di risposta RPC SOAP:

Listato 2. Messaggio di risposta RPC SOAP Hello World

   Ciao mondo    

Poiché dobbiamo accedere ai messaggi SOAP a livello di programmazione nei nostri programmi, abbiamo bisogno di un parser SOAP.

Cos'è l'analisi SOAP?

Ogni parser XML generico con supporto dello spazio dei nomi comprende i messaggi SOAP e può estrarre informazioni da essi. In teoria, possiamo sempre estrarre informazioni di testo da un messaggio SOAP utilizzando un parser XML generico e quindi convertire quelle stringhe di testo in oggetti dati Java quando è necessario utilizzarli. Ad esempio, int i = Integer.parseInt("123");converte una stringa di testo "123"in un valore intero 123. Ma tale conversione manuale grava sui programmatori dell'applicazione. L'estrazione di oggetti dati Java direttamente da un messaggio SOAP fornirebbe un approccio migliore. Immettere il parser SOAP.

Un parser SOAP è costruito su un parser XML generico con meccanismi speciali di mapping dei tipi e di marshalling dei dati di testo. Un parser SOAP comprende le informazioni sul tipo di dati nei messaggi SOAP e converte automaticamente il messaggio SOAP in oggetti dati Java. Il vero valore del parser è che fornisce trasparenza di programmazione tra un programma Java e un messaggio SOAP. Un programmatore inserisce semplicemente gli oggetti Java in un writer SOAP, invia il messaggio, attende la risposta del server e quindi legge gli oggetti Java direttamente dal parser SOAP.

Come ho discusso, SOAP presenta un ricco set di funzionalità. Molti considerano costoso il supporto per l'analisi SOAP su piattaforme wireless con risorse limitate come J2ME / CLDC. Esistono anche difficoltà pratiche:

  1. La piattaforma leggera J2ME / CLDC sacrifica molte utili funzionalità Java standard per dimensioni e velocità. Di conseguenza, la piattaforma J2ME / CLDC ha solo una funzionalità di stringa limitata, un grosso problema per ogni parser XML Java wireless.
  2. L'analisi SOAP richiede che il parser legga l'intero documento in memoria. Ma la maggior parte dei parser J2ME / CLDC sono parser SAX lineari efficienti in termini di memoria, che non costruiscono mai modelli di oggetti in memoria.
  3. La piattaforma J2ME / CLDC non supporta alcuni tipi di dati di base, come il Floattipo.

Fortunatamente, il progetto kSOAP risolve questi problemi e fornisce una soluzione SOAP per piccoli dispositivi.

kSOAP in soccorso

Basato sul suo famoso parser XML generico open source kXML, Enhydra.org ha avviato un progetto open source per l'analisi SOAP su piattaforme J2ME / MIDP, il progetto kSOAP. Parte del progetto EnhydraME, kSOAP è stato scritto da un gruppo di sviluppatori guidato da Stefan Haustein. Enhydra ha rilasciato la prima versione alpha di kSOAP nel maggio 2001. Dopo un anno di sviluppo, kSOAP, ora alla versione 1.2, supporta un set di base di funzionalità SOAP 1.2. Gli esempi e le discussioni sull'architettura di questo articolo si applicano a kSOAP versione 0.95 e successive (vedi Risorse per il codice sorgente completo). Il codice viene eseguito nell'ambiente MIDP; se sei nuovo nello sviluppo MIDP o hai bisogno di aggiornare le tue capacità, fai riferimento alla serie di Michael Cymerman "Device Programming with MIDP".

Questo segmento di codice analizza gli esempi Hello World utilizzando kSOAP:

ByteArrayInputStream bis = nuovo ByteArrayInputStream (mesg.getBytes ()); Lettore InputStreamReader = nuovo InputStreamReader (bis); XmlParser xp = new XmlParser (lettore); // Usa la mappatura predefinita tra gli oggetti Java e gli elementi Soap SoapEnvelope envelope = new SoapEnvelope (new ClassMap (Soap.VER12)); envelope.parse (xp);

La variabile stringa mesgmemorizza l'intero documento SOAP.

Ora dobbiamo recuperare il messaggio dal SOAP analizzato envelope. Il codice seguente recupera il primo figlio sotto l' Bodyelemento SOAP :

// Per Hello World Listing 1 String result = (String) envelope.getBody (); 

Quando applicato a Hello World Listing 1, resultcontiene un valore stringa Hello World.

Questo segmento di codice successivo recupera il primo nipote sotto l' Bodyelemento SOAP :

// Per Hello World Listing 2 String result = (String) envelope.getResult (); 

Il SoapEnvelope.getResult()metodo recupera convenientemente i valori dai messaggi di risposta SOAP RPC come Hello World nel Listato 2. Tuttavia, come ho detto, il valore fondamentale di un parser SOAP non risiede nella sua capacità di recuperare stringhe di testo da un documento SOAP, ma nella sua capacità di mappare Elementi XML SOAP in oggetti Java. Esaminiamo come kSOAP ottiene quella mappatura.

Struttura degli oggetti kSOAP

In un messaggio SOAP, l' xsi:typeattributo di un elemento specifica il tipo di dati del contenuto di un elemento XML. Ad esempio, 123specifica un valore intero di 123 e 123specifica un valore stringa di "123".

kSOAP mappa automaticamente quattro tipi SOAP sui tipi Java in base al seguente elenco:

Mappatura del tipo predefinito
Tipo SOAP Tipo Java
xsd:int java.lang.Integer
xsd:long java.lang.Long
xsd:string java.lang.String
xsd:boolean java.lang.Boolean