Programmering

Få adgang til webtjenester fra trådløse enheder

Som jeg diskuterede i den første Trådløs Java kolonne, "Java Readies Itself for Wireless Web Services", XML-behandlingsfunktion er et af nøglekravene til applikationer til trådløse webtjenester. Standard J2ME / MIDP (Java 2 Platform, Micro Edition / Mobile Information Device Profile) -specifikationen mangler imidlertid standard XML API'er, som heller ikke er inkluderet i den kommende MIDP 2.0-specifikation. Således har vi brug for tredjeparts J2ME / CLDC (Connected Limited Device Configuration) -biblioteker, der kan håndtere XML, især de webservicespecifikke XML-protokoller.

I denne artikel diskuterer jeg, hvordan man behandler webservicemeddelelser ved hjælp af open source kSOAP-pakken på J2ME / MIDP-platformen. Som det er tilfældet med mange andre arkitektoniske virksomheder, involverer webservices både klienter og servere. Da mange diskussioner fokuserer på, hvordan man bruger J2EE (Java 2 Platform, Enterprise Edition) til at udvikle og implementere webservices på serversiden, fokuserer jeg kun på J2ME-klientsiden i denne artikel.

SOAP-fordelen

En vigtig XML-protokol for adgang til webtjenester er SOAP (Simple Object Access Protocol). Sammenlignet med konkurrerende teknologier har SOAP følgende fordele:

  1. SOAP definerer mere end 40 standarddatatyper gennem XML-skema og giver brugerne mulighed for at tilpasse komplekse datatyper. Sådan sofistikeret datatypesupport gør SOAP til et kraftfuldt og rig sprog til udveksling af information mellem nutidens vidt anvendte objektorienterede systemer.
  2. Ud over stærk datatypesupport understøtter SOAP også forskellige messaging-ordninger. Disse ordninger inkluderer synkron fjernopkaldsprocedure (RPC), asynkron messaging, multicast messaging (abonnement) og komplekse meddelelsesruter med flere mellemled.
  3. Da SOAP har fået mainstream-support som en webtjenestemeddelelsesstandard, skal de fleste andre webtjenesteprotokoller interoperere eller binde med SOAP. For eksempel understøtter WSDL (Web Services Description Language), UDDI (Universal Description, Discovery og Integration) og de fleste XML-registre SOAP; XML Digital Signature, XML Encryption, SAML (Security Assertion Markup Language) og andre sikre XML-protokoller giver alle standardbinding med SOAP. Hver bindingsprotokol giver syntaks for sit eget specielle element inde i SOAP-meddelelser. SOAPs fulde understøttelse af XML-navneområder har gjort det let at binde til andre protokoller.

På grund af ovenstående fordele er SOAP allerede den mest anvendte kommunikationsprotokol for webtjenester. Så et grundlæggende krav til en trådløs applikation til webservices er evnen til at forstå SOAP-meddelelser. Lad os nu se på nogle enkle SOAP-eksempler. Liste 1 illustrerer en simpel, generisk SOAP-besked:

Notering 1. Hello World SOAP-besked

  Hej Verden 

SOAP bruges mest i webtjenester RPC'er. En SOAP-svarmeddelelse fra en RPC for webtjenester indeholder normalt returværdierne inde i en Resultat element under SOAP Legeme element. Liste 2 viser en simpel SOAP RPC-svarmeddelelse:

Liste 2. Hello World SOAP RPC-svarmeddelelse

   Hej Verden 

Da vi skal have adgang til SOAP-meddelelser programmatisk i vores programmer, har vi brug for en SOAP-parser.

Hvad er SOAP-parsing?

Hver generisk XML-parser med understøttelse af navneområdet forstår SOAP-meddelelser og kan udtrække information fra dem. I teorien kan vi altid udtrække tekstinformation fra en SOAP-besked ved hjælp af en generisk XML-parser og derefter konvertere disse tekststrenge til Java-dataobjekter, når vi har brug for dem. For eksempel, int i = Integer.parseInt ("123"); konverterer en tekststreng "123" til et helt tal 123. Men sådan manuel konvertering byrder applikationsprogrammerere. Uddrag af Java-dataobjekter direkte fra en SOAP-besked ville give en bedre tilgang. Indtast SOAP-parseren.

En SOAP-parser er bygget på en generisk XML-parser med specielle typekortlægnings- og tekstdata-marshaling-mekanismer. En SOAP-parser forstår datatypeoplysningerne i SOAP-meddelelser og konverterer automatisk SOAP-meddelelsen til Java-dataobjekter. Parserens reelle værdi er, at det giver programmeringsgennemsigtighed mellem et Java-program og en SOAP-meddelelse. En programmør føder bare Java-objekter til en SOAP-forfatter, sender beskeden, venter på serverens svar og læser derefter Java-objekter direkte fra SOAP-parseren.

Som jeg diskuterede, har SOAP et rigt sæt funktioner. Mange betragter understøttelse af SOAP-parsing på ressourcebegrænsede trådløse platforme som J2ME / CLDC som dyre. Praktiske vanskeligheder findes også:

  1. Den lette J2ME / CLDC-platform ofrer mange nyttige standard Java-funktioner til størrelse og hastighed. Som et resultat har J2ME / CLDC-platformen kun begrænset strengfunktionalitet, et stort problem for enhver trådløs Java XML-parser.
  2. SOAP-parsing kræver, at parseren læser hele dokumentet i hukommelsen. Men de fleste J2ME / CLDC-parsere er hukommelseseffektive lineære SAX-parsere, som aldrig konstruerer objektmodeller i hukommelsen.
  3. J2ME / CLDC-platformen mangler support til nogle grundlæggende datatyper, f.eks Flyde type.

Heldigvis løser projekt kSOAP disse problemer og giver en SOAP-løsning til små enheder.

kSOAP til undsætning

Baseret på sin berømte open source generiske XML-parser kXML, har Enhydra.org startet et open source-projekt til SOAP-parsing på J2ME / MIDP-platforme - kSOAP-projektet. En del af EnhydraME-projektet, kSOAP, blev skrevet af en gruppe udviklere ledet af Stefan Haustein. Enhydra udgav kSOAPs første alfa-version i maj 2001. Efter et års udvikling understøtter kSOAP, nu i version 1.2, et kernesæt med SOAP 1.2-funktioner. Denne artikels eksempler og arkitekturdiskussioner gælder for kSOAP version 0.95 og derover (se Ressourcer for den fulde kildekode). Koden kører i MIDP-miljøet; hvis du er ny inden for MIDP-udvikling eller har brug for at opdatere dine færdigheder, skal du se Michael Cymermans serie "Device Programming with MIDP."

Dette kodesegment analyserer Hello World-eksemplerne ved hjælp af kSOAP:

ByteArrayInputStream bis = ny ByteArrayInputStream (mesg.getBytes ()); InputStreamReader-læser = ny InputStreamReader (bis); XmlParser xp = ny XmlParser (læser); // Brug standardkortlægning mellem Java-objekter og sæbeelementer SoapEnvelope envelope = new SoapEnvelope (new ClassMap (Soap.VER12)); kuvert. parse (xp); 

Strengvariablen mesg gemmer hele SOAP-dokumentet.

Nu skal vi hente beskeden fra den analyserede SOAP kuvert. Den følgende kode henter det første barn under SOAP Legeme element:

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

Når det anvendes til Hello World Listing 1, resultat indeholder strengværdi Hej Verden.

Dette næste kodesegment henter det første barnebarn under SOAP Legeme element:

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

Det SoapEnvelope.getResult () metode henter bekvemt værdier fra SOAP RPC-svarmeddelelser som Hello World in Listing 2. Imidlertid, som jeg har sagt, ligger en SOAP-parsers kerneværdi ikke i dens evne til at hente tekststrenge fra et SOAP-dokument, men i dets evne til at kortlægge SOAP XML-elementer til Java-objekter. Lad os undersøge, hvordan kSOAP opnår denne kortlægning.

struktur af kSOAP-objekter

I en SOAP-besked er et element xsi: type attribut specificerer datatypen for et XML-elements indhold. For eksempel, 123 angiver en heltalværdi på 123, og 123 angiver en strengværdi på "123".

kSOAP kortlægger automatisk fire SOAP-typer til Java-typer i henhold til følgende liste:

Standardtypekortlægning
SOAP-typeJava-type
xsd: intjava.lang. heltal
xsd: langjava.lang. lang
xsd: strengjava.lang.Streng
xsd: boolskjava.lang.Boolean