Greifen Sie über drahtlose Geräte auf Webdienste zu

Wie ich in der ersten Spalte zu Wireless Java , "Java bereitet sich auf Wireless Web Services vor", erläutert habe , stellt die XML-Verarbeitungsfunktion eine der Hauptanforderungen für Wireless Web Services-Anwendungen dar. In der Standardspezifikation J2ME / MIDP (Java 2 Platform, Micro Edition / Mobile Information Device Profile) fehlen jedoch Standard-XML-APIs, die auch in der kommenden MIDP 2.0-Spezifikation nicht enthalten sind. Daher benötigen wir J2ME / CLDC-Bibliotheken (Connected Limited Device Configuration) von Drittanbietern, die XML verarbeiten können, insbesondere die für Webdienste spezifischen XML-Protokolle.

In diesem Artikel werde ich die Verarbeitung von Webdienstnachrichten mithilfe des Open Source-Pakets kSOAP auf der J2ME / MIDP-Plattform erläutern. Wie viele andere Enterprise-Computing-Architekturen umfassen Webdienste sowohl Clients als auch Server. Da sich viele Diskussionen auf die Verwendung von J2EE (Java 2 Platform, Enterprise Edition) zum Entwickeln und Bereitstellen von Webdiensten auf der Serverseite konzentrieren, konzentriere ich mich in diesem Artikel nur auf die J2ME-Clientseite.

Der SOAP-Vorteil

Ein wichtiges XML-Protokoll für den Zugriff auf Webdienste ist SOAP (Simple Object Access Protocol). Im Vergleich zu konkurrierenden Technologien bietet SOAP die folgenden Vorteile:

  1. SOAP definiert mehr als 40 Standarddatentypen über das XML-Schema und ermöglicht Benutzern das benutzerdefinierte Definieren komplexer Datentypen. Diese ausgefeilte Unterstützung für Datentypen macht SOAP zu einer leistungsstarken und umfangreichen Sprache für den Informationsaustausch zwischen den heute weit verbreiteten objektorientierten Systemen.
  2. Neben der starken Unterstützung von Datentypen unterstützt SOAP auch verschiedene Messaging-Schemata. Diese Schemata umfassen synchrone Remoteprozeduraufrufe (RPC), asynchrones Messaging, Multicast-Messaging (Abonnement) und komplexe Nachrichtenrouten mit mehreren Vermittlern.
  3. Da SOAP als Messaging-Standard für Webdienste allgemeine Unterstützung erhalten hat, müssen die meisten anderen Webdienstprotokolle mit SOAP zusammenarbeiten oder eine Bindung herstellen. Beispielsweise unterstützen WSDL (Web Services Description Language), UDDI (Universal Description, Discovery und Integration) und die meisten XML-Register SOAP. Digitale XML-Signatur, XML-Verschlüsselung, SAML (Security Assertion Markup Language) und andere sichere XML-Protokolle bieten Standardbindung mit SOAP. Jedes Bindungsprotokoll bietet die Syntax eines eigenen speziellen Elements in SOAP-Nachrichten. Die vollständige Unterstützung von SOAP für XML-Namespaces hat die Bindung an andere Protokolle vereinfacht.

Aufgrund der oben genannten Vorteile ist SOAP bereits das am häufigsten verwendete Kommunikationsprotokoll für Webdienste. Eine Grundvoraussetzung für eine drahtlose Webdienstanwendung ist daher die Fähigkeit, SOAP-Nachrichten zu verstehen. Schauen wir uns nun einige einfache SOAP-Beispiele an. Listing 1 zeigt eine einfache, generische SOAP-Nachricht:

Listing 1. Hallo Welt SOAP Nachricht

  Hallo Welt   

SOAP wird am häufigsten in Webdienst-RPCs verwendet. Eine SOAP-Antwortnachricht von einem Webdienst-RPC enthält normalerweise die Rückgabewerte in einem ResultElement unter dem SOAP- BodyElement. Listing 2 zeigt eine einfache SOAP RPC-Antwortnachricht:

Listing 2. Hello World SOAP RPC-Antwortnachricht

   Hallo Welt    

Da wir in unseren Programmen programmgesteuert auf SOAP-Nachrichten zugreifen müssen, benötigen wir einen SOAP-Parser.

Was ist SOAP-Analyse?

Jeder generische XML-Parser mit Namespace-Unterstützung versteht SOAP-Nachrichten und kann Informationen daraus extrahieren. Theoretisch können wir mit einem generischen XML-Parser immer Textinformationen aus einer SOAP-Nachricht extrahieren und diese Textzeichenfolgen dann in Java-Datenobjekte konvertieren, wenn wir sie verwenden müssen. Zum Beispiel int i = Integer.parseInt("123");wandelt eine Textzeichenfolge "123"auf einen ganzzahligen Wert 123. Aber eine solche manuelle Konvertierung Belastungen Anwendungsprogrammierer. Das Extrahieren von Java-Datenobjekten direkt aus einer SOAP-Nachricht würde einen besseren Ansatz bieten. Geben Sie den SOAP-Parser ein.

Ein SOAP-Parser basiert auf einem generischen XML-Parser mit speziellen Mechanismen für Typzuordnung und Textdaten-Marshalling. Ein SOAP-Parser versteht die Datentypinformationen in SOAP-Nachrichten und konvertiert die SOAP-Nachricht automatisch in Java-Datenobjekte. Der wahre Wert des Parsers besteht darin, dass er Programmiertransparenz zwischen einem Java-Programm und einer SOAP-Nachricht bietet. Ein Programmierer führt Java-Objekte einfach in einen SOAP-Writer ein, sendet die Nachricht, wartet auf die Serverantwort und liest dann Java-Objekte direkt aus dem SOAP-Parser.

Wie bereits erwähnt, bietet SOAP eine Vielzahl von Funktionen. Viele halten die Unterstützung von SOAP-Parsing auf ressourcenbeschränkten drahtlosen Plattformen wie J2ME / CLDC für teuer. Es gibt auch praktische Schwierigkeiten:

  1. Die leichte J2ME / CLDC-Plattform bietet viele nützliche Standard-Java-Funktionen für Größe und Geschwindigkeit. Infolgedessen verfügt die J2ME / CLDC-Plattform nur über eingeschränkte Zeichenfolgenfunktionen, ein Hauptproblem für jeden drahtlosen Java XML-Parser.
  2. Beim SOAP-Parsing muss der Parser das gesamte Dokument in den Speicher lesen. Die meisten J2ME / CLDC-Parser sind jedoch speichereffiziente lineare SAX-Parser, die niemals speicherinterne Objektmodelle erstellen.
  3. Die J2ME / CLDC-Plattform unterstützt einige grundlegende Datentypen nicht, z. B. den FloatTyp.

Glücklicherweise löst das Projekt kSOAP diese Probleme und bietet eine SOAP-Lösung für kleine Geräte.

kSOAP zur Rettung

Basierend auf dem bekannten generischen Open-Source-XML-Parser kXML hat Enhydra.org ein Open-Source-Projekt für die SOAP-Analyse auf J2ME / MIDP-Plattformen gestartet - das kSOAP-Projekt. Als Teil des EnhydraME-Projekts wurde kSOAP von einer Gruppe von Entwicklern unter der Leitung von Stefan Haustein geschrieben. Enhydra veröffentlichte im Mai 2001 die erste Alpha-Version von kSOAP. Nach einem Jahr der Entwicklung unterstützt kSOAP, jetzt in Version 1.2, einen Kernsatz von SOAP 1.2-Funktionen. Die Beispiele und Architekturdiskussionen dieses Artikels gelten für kSOAP Version 0.95 und höher (den vollständigen Quellcode finden Sie unter Ressourcen). Der Code wird in der MIDP-Umgebung ausgeführt. Wenn Sie neu in der MIDP-Entwicklung sind oder Ihre Fähigkeiten auffrischen müssen, lesen Sie Michael Cymermans Serie "Geräteprogrammierung mit MIDP".

Dieses Codesegment analysiert die Hello World-Beispiele mit kSOAP:

ByteArrayInputStream bis = neuer ByteArrayInputStream (mesg.getBytes ()); InputStreamReader reader = neuer InputStreamReader (bis); XmlParser xp = neuer XmlParser (Leser); // Standardzuordnung zwischen Java-Objekten und Seifenelementen verwenden SoapEnvelope Envelope = new SoapEnvelope (new ClassMap (Soap.VER12)); Envelope.parse (xp);

Die Zeichenfolgenvariable mesgspeichert das gesamte SOAP-Dokument.

Jetzt müssen wir die Nachricht von der analysierten SOAP abrufen envelope. Der folgende Code ruft das erste untergeordnete BodyElement unter dem SOAP- Element ab:

// Für Hello World Listing 1 String result = (String) Envelope.getBody (); 

resultEnthält bei Anwendung auf Hello World Listing 1 einen Zeichenfolgenwert Hello World.

Dieses nächste Codesegment ruft das erste Enkelkind unter dem SOAP- BodyElement ab:

// Für Hello World Listing 2 String result = (String) Envelope.getResult (); 

Die SoapEnvelope.getResult()Methode ruft bequem Werte aus SOAP-RPC-Antwortnachrichten wie der Hello World in Listing 2 ab. Wie ich bereits sagte, liegt der Kernwert eines SOAP-Parsers jedoch nicht in seiner Fähigkeit, Textzeichenfolgen aus einem SOAP-Dokument abzurufen, sondern in seiner Fähigkeit, zuzuordnen SOAP XML-Elemente zu Java-Objekten. Lassen Sie uns untersuchen, wie kSOAP diese Zuordnung erreicht.

kSOAP-Objektstruktur

In einer SOAP-Nachricht gibt das xsi:typeAttribut eines Elements den Datentyp des Inhalts eines XML-Elements an. Gibt beispielsweise 123einen ganzzahligen Wert von 123 und 123einen Zeichenfolgenwert von 123 an "123".

kSOAP ordnet automatisch vier SOAP-Typen gemäß der folgenden Liste Java-Typen zu:

Standardtypzuordnung
SOAP-Typ Java-Typ
xsd:int java.lang.Integer
xsd:long java.lang.Long
xsd:string java.lang.String
xsd:boolean java.lang.Boolean