Programavimas

Pasiekite interneto paslaugas iš belaidžių įrenginių

Kaip aptariau pirmajame Belaidė „Java“ stulpelis „Java pati nuskaito belaidžio interneto paslaugas“, XML apdorojimo galimybė yra vienas pagrindinių belaidžio interneto paslaugų programų reikalavimų. Tačiau standartinėje „J2ME / MIDP“ („Java 2 Platform“, „Micro Edition“ / „Mobile Information Device Profile“) specifikacijoje trūksta standartinių XML API, kurie taip pat nėra įtraukti į būsimą MIDP 2.0 specifikaciją. Taigi mums reikia trečiųjų šalių J2ME / CLDC („Connected Limited Device Configuration“) bibliotekų, kurios galėtų tvarkyti XML, ypač tų žiniatinklio tarnyboms būdingų XML protokolų.

Šiame straipsnyje aptariu, kaip apdoroti žiniatinklio paslaugų pranešimus naudojant atvirojo kodo kSOAP paketą J2ME / MIDP platformoje. Kaip ir daugelyje kitų įmonės skaičiavimo architektūrų, žiniatinklio paslaugos apima klientus ir serverius. Kadangi daugelyje diskusijų daugiausia dėmesio skiriama tam, kaip naudoti J2EE („Java 2 Platform“, „Enterprise Edition“) kuriant ir diegiant žiniatinklio paslaugas serverio pusėje, šiame straipsnyje daugiausia dėmesio skiriu tik J2ME kliento pusei.

Muilo pranašumas

Svarbus XML protokolas norint pasiekti žiniatinklio paslaugas yra SOAP (paprastas prieigos prie objektų protokolas). Palyginti su konkuruojančiomis technologijomis, SOAP turi šiuos privalumus:

  1. SOAP apibrėžia daugiau nei 40 standartinių duomenų tipų per XML schemą ir leidžia vartotojams individualiai apibrėžti sudėtingus duomenų tipus. Dėl tokio sudėtingo duomenų tipo palaikymo SOAP yra galinga ir turtinga kalba, skirta keistis informacija tarp šiandien plačiai diegiamų objektyvių sistemų.
  2. Be stipraus duomenų tipo palaikymo, SOAP taip pat palaiko įvairias pranešimų siuntimo schemas. Šios schemos apima sinchroninius nuotolinių procedūrų iškvietimus (RPC), asinchroninius pranešimus, daugiaadresių pranešimų siuntimą (prenumeratą) ir sudėtingus pranešimų maršrutus su keliais tarpininkais.
  3. Kadangi SOAP įgijo pagrindinį palaikymą kaip žiniatinklio paslaugų pranešimų standartą, dauguma kitų žiniatinklio paslaugų protokolų turi sąveikauti arba susieti su SOAP. Pavyzdžiui, WSDL (žiniatinklio paslaugų aprašo kalba), UDDI (universalus aprašymas, aptikimas ir integravimas) ir dauguma XML registrų palaiko SOAP; XML skaitmeninis parašas, XML šifravimas, SAML (Security Assertion Markup Language) ir kiti saugūs XML protokolai suteikia standartinį susiejimą su SOAP. Kiekvienas įrišimo protokolas SOAP pranešimuose pateikia savo specialaus elemento sintaksę. Visiškas SOAP palaikymas XML vardų sritims palengvino susiejimą su kitais protokolais.

Dėl aukščiau išvardytų pranašumų SOAP jau yra plačiausiai naudojamas interneto paslaugų ryšio protokolas. Taigi, pagrindinis bevielio tinklo paslaugos reikalavimas yra galimybė suprasti SOAP pranešimus. Dabar pažvelkime į keletą paprastų muilo pavyzdžių. 1 sąrašas iliustruoja paprastą, bendrą SOAP pranešimą:

Sąrašas 1. Hello World SOAP pranešimas

  Labas pasauli 

SOAP plačiausiai naudojamas žiniatinklio paslaugų RPC. SOAP atsakymo pranešime iš žiniatinklio paslaugų RPC paprastai yra grąžinimo vertės a viduje Rezultatas po SOAP kūnas elementas. 2 sąraše rodomas paprastas SOAP RPC atsakymo pranešimas:

Sąrašas 2. Hello World SOAP RPC atsakymo pranešimas

   Labas pasauli 

Kadangi savo programose turime programiškai pasiekti SOAP pranešimus, mums reikia SOAP analizatoriaus.

Kas yra SOAP analizavimas?

Kiekvienas bendras XML analizatorius su vardų srities palaikymu supranta SOAP pranešimus ir gali iš jų išskleisti informaciją. Teoriškai mes visada galime išgauti tekstinę informaciją iš SOAP pranešimo naudodami bendrą XML analizatorių ir tada tas teksto eilutes paversti „Java“ duomenų objektais, kai mums jas reikia naudoti. Pavyzdžiui, int i = Sveikasis skaičius.parseInt ("123"); paverčia teksto eilutę "123" iki sveikojo skaičiaus 123. Tačiau tokia rankinė konversija apsunkina programų programuotojus. „Java“ duomenų objektų išskyrimas tiesiai iš SOAP pranešimo suteiktų geresnį požiūrį. Įveskite SOAP analizatorių.

SOAP analizatorius yra sukurtas ant bendro XML analizatoriaus su specialiais tipų atvaizdavimo ir teksto duomenų sukūrimo mechanizmais. SOAP analizatorius supranta SOAP pranešimų duomenų tipo informaciją ir automatiškai konvertuoja SOAP pranešimą į „Java“ duomenų objektus. Analizatoriaus tikroji vertė yra ta, kad jis suteikia programavimo skaidrumą tarp „Java“ programos ir SOAP pranešimo. Programuotojas tiesiog tiekia „Java“ objektus į SOAP rašytoją, siunčia pranešimą, laukia serverio atsakymo ir tada skaito „Java“ objektus tiesiai iš SOAP analizatoriaus.

Kaip jau aptariau, SOAP turi daug funkcijų. Daugelis mano, kad SOAP analizavimo palaikymas ribotų išteklių belaidėse platformose, tokiose kaip J2ME / CLDC, yra brangus. Taip pat egzistuoja praktiniai sunkumai:

  1. Lengva J2ME / CLDC platforma aukoja daugybę naudingų standartinių „Java“ funkcijų dėl dydžio ir greičio. Todėl J2ME / CLDC platforma turi tik ribotą eilutės funkcionalumą, o tai yra pagrindinė problema kiekvienam belaidžiui „Java XML“ analizatoriui.
  2. SOAP analizuojant reikia analizatoriui perskaityti visą dokumentą į atmintį. Tačiau dauguma J2ME / CLDC analizatorių yra atminties požiūriu efektyvūs linijiniai SAX analizatoriai, kurie niekada nekonstruoja atminties objektų modelių.
  3. J2ME / CLDC platformoje trūksta kai kurių pagrindinių duomenų tipų palaikymo, tokių kaip Plūdė tipo.

Laimei, projektas kSOAP išsprendžia šias problemas ir pateikia SOAP sprendimą mažiems įrenginiams.

kSOAP į pagalbą

Remdamasis savo garsiuoju atvirojo kodo bendruoju XML analizatoriumi kXML, Enhydra.org pradėjo atvirojo kodo projektą SOAP analizuoti J2ME / MIDP platformose - kSOAP projektą. Dalį „EnhydraME“ projekto kSOAP parašė kūrėjų grupė, vadovaujama Stefano Hausteino. Pirmąją „kSOAP“ alfa versiją „Enhydra“ išleido 2001 m. Gegužės mėn. Po metų plėtros kSOAP, dabar versijoje 1.2, palaiko pagrindinį SOAP 1.2 funkcijų rinkinį. Šio straipsnio pavyzdžiai ir architektūros diskusijos taikomos kSOAP 0.95 versijai ir naujesnėms versijoms (visą šaltinio kodą žr. Ištekliai). Kodas veikia MIDP aplinkoje; jei dar nesinaudojote MIDP kūrimu ar turite atnaujinti savo įgūdžius, skaitykite Michaelo Cymermano seriją „Įrenginių programavimas naudojant MIDP“.

Šis kodo segmentas analizuoja „Hello World“ pavyzdžius naudodamas kSOAP:

ByteArrayInputStream bis = naujas ByteArrayInputStream (mesg.getBytes ()); „InputStreamReader“ skaitytuvas = naujas „InputStreamReader“ (bis); XmlParser xp = naujas XmlParser (skaitytuvas); // Naudokite numatytąjį „Java“ objektų ir muilo elementų atvaizdavimą SoapEnvelope ümbrė = new SoapEnvelope (naujas „ClassMap“ (Soap.VER12)); vokelis.parse (xp); 

Eilutės kintamasis mesg saugo visą SOAP dokumentą.

Dabar turime gauti pranešimą iš išanalizuoto SOAP vokas. Šis kodas gauna pirmąjį vaiką pagal SOAP kūnas elementas:

// „Hello World Listing 1“ eilutės rezultatas = (String) ümbrelis.getBody (); 

Kai taikoma „Hello World Listing 1“, rezultatas yra eilutės vertė Labas pasauli.

Šis kitas kodo segmentas gauna pirmąjį anūką pagal SOAP kūnas elementas:

// „Hello World Listing 2“ eilutės rezultatas = (String) ümbrelis.getResult (); 

SoapEnvelope.getResult () metodas patogiai nuskaito vertes iš SOAP RPC atsakymo pranešimų, tokių kaip „Hello World in Listing 2“. Tačiau, kaip jau minėjau, pagrindinė SOAP analizatoriaus vertė slypi ne gebėjime gauti teksto eilutes iš SOAP dokumento, o gebėjime susieti SOAP XML elementai į Java objektus. Panagrinėkime, kaip kSOAP pasiekia tą žemėlapį.

kSOAP objektų struktūra

SOAP pranešime elementas xsi: tipas atributas nurodo XML elemento turinio duomenų tipą. Pavyzdžiui, 123 nurodo sveiko skaičiaus reikšmę 123 ir 123 nurodo eilutės reikšmę "123".

kSOAP automatiškai susieja keturis SOAP tipus su Java tipais pagal šį sąrašą:

Numatytasis tipo atvaizdavimas
MUILO tipas„Java“ tipas
xsd: tarptjava.lang.Integer
xsd: ilgasjava.lang.Long
xsd: eilutėjava.lang.Stringas
xsd: loginėjava.lang.Boolean
$config[zx-auto] not found$config[zx-overlay] not found