Programmering

Få tilgang til webtjenester fra trådløse enheter

Som jeg diskuterte i den første Trådløs Java kolonne, "Java Readies Itself for Wireless Web Services", XML-behandlingsfunksjon representerer et av hovedkravene for applikasjoner for trådløse webtjenester. Standard J2ME / MIDP (Java 2 Platform, Micro Edition / Mobile Information Device Profile) spesifikasjon mangler imidlertid standard XML APIer, som heller ikke er inkludert i den kommende MIDP 2.0-spesifikasjonen. Dermed trenger vi tredjeparts J2ME / CLDC (Connected Limited Device Configuration) -biblioteker som kan håndtere XML, spesielt de webtjenestespesifikke XML-protokollene.

I denne artikkelen diskuterer jeg hvordan man behandler webtjenestemeldinger ved hjelp av kSOAP-pakken med åpen kildekode på J2ME / MIDP-plattformen. Som mange andre databehandlingsarkitekturer for bedrifter, involverer webtjenester både klienter og servere. Som mange diskusjoner fokuserer på hvordan du bruker J2EE (Java 2 Platform, Enterprise Edition) til å utvikle og distribuere webtjenester på serversiden, fokuserer jeg bare på J2ME-klientsiden i denne artikkelen.

SOAP-fordelen

En viktig XML-protokoll for tilgang til webtjenester er SOAP (Simple Object Access Protocol). Sammenlignet med konkurrerende teknologier har SOAP følgende fordeler:

  1. SOAP definerer mer enn 40 standard datatyper gjennom XML Schema og lar brukerne definere komplekse datatyper. Slike sofistikerte datatypestøtte gjør SOAP til et kraftig og rikt språk for utveksling av informasjon mellom dagens vidt distribuerte objektorienterte systemer.
  2. I tillegg til sterk datatypestøtte, støtter SOAP også ulike meldingsordninger. Disse ordningene inkluderer RPC (synkron fjernprosedyranrop), asynkrone meldinger, multicast-meldinger (abonnement) og komplekse meldingsveier med flere mellommenn.
  3. Siden SOAP har fått mainstream-støtte som en meldingsstandard for webtjenester, må de fleste andre webtjenesteprotokoller samarbeide eller binde seg til SOAP. For eksempel støtter WSDL (Web Services Description Language), UDDI (Universal Description, Discovery, and Integration) og de fleste XML-registre SOAP; XML Digital Signature, XML Encryption, SAML (Security Assertion Markup Language) og andre sikre XML-protokoller gir alle standard binding med SOAP. Hver bindingsprotokoll gir syntaks for sitt eget spesielle element i SOAP-meldinger. SOAPs fulle støtte for XML-navneområder har gjort det enkelt å binde med andre protokoller.

På grunn av fordelene ovenfor er SOAP allerede den mest brukte kommunikasjonsprotokollen for webtjenester. Så et grunnleggende krav til et trådløst webtjenesteapplikasjon er muligheten til å forstå SOAP-meldinger. La oss nå se på noen enkle SOAP-eksempler. Oppføring 1 illustrerer en enkel, generisk SOAP-melding:

Oppføring 1. Hello World SOAP-melding

  Hei Verden 

SOAP er mest brukt i webtjenester RPC. En SOAP-svarmelding fra en RPC for webtjenester inneholder vanligvis returverdiene inne i Resultat element under SOAP Kropp element. Oppføring 2 viser en enkel SOAP RPC-svarmelding:

Oppføring 2. Hello World SOAP RPC svarmelding

   Hei Verden 

Siden vi må få tilgang til SOAP-meldinger programmatisk i programmene våre, trenger vi en SOAP-parser.

Hva er SOAP-parsing?

Hver generiske XML-parser med støtte for navneområdet forstår SOAP-meldinger og kan trekke ut informasjon fra dem. I teorien kan vi alltid trekke ut tekstinformasjon fra en SOAP-melding ved hjelp av en generell XML-parser og deretter konvertere tekststrengene til Java-dataobjekter når vi trenger å bruke dem. For eksempel, int i = Integer.parseInt ("123"); konverterer en tekststreng "123" til et helt tall 123. Men slik manuell konvertering byrder applikasjonsprogrammerere. Å trekke ut Java-dataobjekter direkte fra en SOAP-melding vil gi en bedre tilnærming. Skriv inn SOAP-parseren.

En SOAP-parser er bygget på en generisk XML-parser med spesielle typekartleggings- og tekstdata-marshaling-mekanismer. En SOAP-parser forstår datatypeinformasjonen i SOAP-meldinger og konverterer automatisk SOAP-meldingen til Java-dataobjekter. Analysatorens virkelige verdi er at den gir programmeringsgjennomsiktighet mellom et Java-program og en SOAP-melding. En programmerer mater bare Java-objekter i en SOAP-forfatter, sender meldingen, venter på serverresponsen, og leser deretter Java-objekter direkte fra SOAP-parseren.

Som jeg diskuterte, har SOAP et rikt sett med funksjoner. Mange anser SOAP-parsing-støtte på ressursbegrensede trådløse plattformer som J2ME / CLDC som dyre. Praktiske vanskeligheter eksisterer også:

  1. Den lette J2ME / CLDC-plattformen ofrer mange nyttige standard Java-funksjoner for størrelse og hastighet. Som et resultat har J2ME / CLDC-plattformen bare begrenset strengfunksjonalitet, et stort problem for hver trådløs Java XML-parser.
  2. SOAP-parsing krever at parseren leser hele dokumentet i minnet. Men de fleste J2ME / CLDC-parsere er minneeffektive lineære SAX-parsers, som aldri konstruerer objektmodeller i minnet.
  3. J2ME / CLDC-plattformen mangler støtte for noen grunnleggende datatyper, for eksempel Flyte type.

Heldigvis løser prosjekt kSOAP disse problemene og gir en SOAP-løsning for små enheter.

kSOAP til unnsetning

Basert på sin anerkjente open source generiske XML-parser kXML, har Enhydra.org startet et open source-prosjekt for SOAP-parsing på J2ME / MIDP-plattformer - kSOAP-prosjektet. En del av EnhydraME-prosjektet, kSOAP ble skrevet av en gruppe utviklere ledet av Stefan Haustein. Enhydra ga ut kSOAPs første alfaversjon i mai 2001. Etter et års utvikling støtter kSOAP, nå i versjon 1.2, et kjernesett med SOAP 1.2-funksjonaliteter. Denne artikkelens eksempler og arkitekturdiskusjoner gjelder kSOAP versjon 0.95 og utover (se Ressurser for full kildekode). Koden kjører i MIDP-miljøet; hvis du er ny innen MIDP-utvikling eller trenger å oppdatere ferdighetene dine, se Michael Cymermans serie "Device Programming with MIDP."

Dette kodesegmentet analyserer Hello World-eksemplene ved hjelp av kSOAP:

ByteArrayInputStream bis = ny ByteArrayInputStream (mesg.getBytes ()); InputStreamReader-leser = ny InputStreamReader (bis); XmlParser xp = ny XmlParser (leser); // Bruk standard kartlegging mellom Java-objekter og såpeelementer SoapEnvelope envelope = new SoapEnvelope (new ClassMap (Soap.VER12)); konvolutt. parse (xp); 

Strengvariabelen mesg lagrer hele SOAP-dokumentet.

Nå må vi hente meldingen fra den analyserte såpen konvolutt. Følgende kode henter det første barnet under SOAP Kropp element:

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

Når den brukes på Hello World Listing 1, resultat inneholder strengverdi Hei Verden.

Dette neste kodesegmentet henter det første barnebarnet under SOAP Kropp element:

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

De SoapEnvelope.getResult () metoden henter beleilig verdier fra SOAP RPC-svarmeldinger som Hello World in Listing 2. Imidlertid, som jeg har sagt, ligger en SOAP-parsers kjerneverdi ikke i dens evne til å hente tekststrenger fra et SOAP-dokument, men i dets evne til å kartlegge SOAP XML-elementer til Java-objekter. La oss undersøke hvordan kSOAP oppnår den kartleggingen.

strukturen til kSOAP-objekter

I en SOAP-melding, er et element xsi: type attributt spesifiserer datatypen til innholdet i et XML-element. For eksempel, 123 angir et heltall på 123, og 123 angir en strengverdi på "123".

kSOAP tilordner automatisk fire SOAP-typer til Java-typer i henhold til følgende liste:

Standardtypekartlegging
SOAP-typeJava-type
xsd: intjava.lang. heltall
xsd: langjava.lang. lang
xsd: strengjava.lang.Streng
xsd: boolskjava.lang.Boolean
$config[zx-auto] not found$config[zx-overlay] not found