Programiranje

Dostopajte do spletnih storitev iz brezžičnih naprav

Kot sem razpravljal v prvem Brezžična Java stolpec, "Java se sama pripravlja za brezžične spletne storitve", zmogljivost obdelave XML predstavlja eno ključnih zahtev za aplikacije brezžičnih spletnih storitev. Vendar pa v standardni specifikaciji J2ME / MIDP (Java 2 Platform, Micro Edition / Profil mobilnih informacijskih naprav) manjkajo standardni API-ji XML, ki niso vključeni niti v prihodnjo specifikacijo MIDP 2.0. Zato potrebujemo neodvisne knjižnice J2ME / CLDC (Connected Limited Device Configuration), ki lahko obdelujejo XML, zlasti tiste protokole XML, specifične za spletne storitve.

V tem članku razpravljam o obdelavi sporočil spletnih storitev z uporabo odprtokodnega paketa kSOAP na platformi J2ME / MIDP. Tako kot mnoge druge arhitekture računalništva v podjetju tudi pri spletnih storitvah sodelujejo odjemalci in strežniki. Ker se številne razprave osredotočajo na to, kako uporabiti J2EE (Java 2 Platform, Enterprise Edition) za razvoj in uvajanje spletnih storitev na strežniški strani, se v tem članku osredotočam le na odjemalsko stran J2ME.

Prednost SOAP

Pomemben protokol XML za dostop do spletnih storitev je SOAP (Simple Object Access Protocol). V primerjavi s konkurenčnimi tehnologijami ima SOAP naslednje prednosti:

  1. SOAP prek sheme XML definira več kot 40 standardnih podatkovnih tipov in uporabnikom omogoča, da zapletene podatkovne tipe definirajo po meri. Tako izpopolnjena podpora podatkovnemu tipu naredi SOAP zmogljiv in bogat jezik za izmenjavo informacij med današnjimi široko uporabljenimi objektno usmerjenimi sistemi.
  2. Poleg močne podpore podatkovnega tipa SOAP podpira tudi različne sheme sporočanja. Te sheme vključujejo sinhrone klice oddaljenih postopkov (RPC), asinhrono sporočanje, večsmerno sporočanje (naročnina) in zapletene poti sporočil z več posredniki.
  3. Ker je SOAP dobil splošno podporo kot standard sporočanja spletnih storitev, mora večina drugih protokolov spletnih storitev medsebojno delovati ali se vezati s SOAP. Na primer, WSDL (jezik za opis spletnih storitev), UDDI (univerzalni opis, odkrivanje in integracija) in večina registrov XML podpira SOAP; XML Digital Signature, XML Encryption, SAML (Security Assertion Markup Language) in drugi varni protokoli XML zagotavljajo standardno vezavo s SOAP. Vsak vezavni protokol vsebuje sintakso svojega posebnega elementa znotraj sporočil SOAP. Popolna podpora SOAP za imenske prostore XML je olajšala povezovanje z drugimi protokoli.

Zaradi zgoraj navedenih prednosti je SOAP že najpogosteje uporabljeni komunikacijski protokol za spletne storitve. Osnovna zahteva za uporabo brezžične spletne storitve je sposobnost razumevanja sporočil SOAP. Zdaj pa si oglejmo nekaj preprostih primerov SOAP. Seznam 1 prikazuje preprosto, splošno sporočilo SOAP:

Seznam 1. Sporočilo SOAP Hello World

  Pozdravljen, svet 

SOAP se najpogosteje uporablja v RPC-jih spletnih storitev. Odzivno sporočilo SOAP iz RPC spletnih storitev običajno vsebuje vrnjene vrednosti znotraj a Rezultat element pod SOAP Telo element. Seznam 2 prikazuje preprosto odzivno sporočilo SOAP RPC:

Seznam 2. Odzivno sporočilo Hello World SOAP RPC

   Pozdravljen, svet 

Ker moramo v svojih programih programsko dostopati do sporočil SOAP, potrebujemo razčlenjevalnik SOAP.

Kaj je razčlenitev SOAP?

Vsak generični razčlenjevalnik XML s podporo za imenski prostor razume sporočila SOAP in lahko iz njih pridobiva informacije. Teoretično lahko iz splošnega razčlenjevalnika XML vedno izvlečemo besedilne informacije iz sporočila SOAP in nato te besedilne nize pretvorimo v podatkovne objekte Java, ko jih moramo uporabiti. Na primer, int i = Integer.parseInt ("123"); pretvori besedilni niz "123" na celoštevilčno vrednost 123. Toda takšna ročna pretvorba obremenjuje aplikacijske programerje. Izvleček podatkovnih predmetov Java neposredno iz sporočila SOAP bi zagotovil boljši pristop. Vnesite razčlenjevalnik SOAP.

Razčlenjevalnik SOAP je zgrajen na splošnem razčlenjevalniku XML s posebnimi mehanizmi za preslikavo vrst in razvrščanje besedilnih podatkov. Razčlenjevalnik SOAP razume podatke o tipu podatkov v sporočilih SOAP in samodejno pretvori sporočilo SOAP v podatkovne objekte Java. Resnična vrednost razčlenjevalnika je, da zagotavlja programsko preglednost med programom Java in sporočilom SOAP. Programer samo podaja predmete Java v zapisovalnik SOAP, pošlje sporočilo, čaka na odgovor strežnika in nato prebere predmete Java neposredno iz razčlenjevalnika SOAP.

Kot sem že razpravljal, ima SOAP bogat nabor funkcionalnosti. Številni menijo, da je podpora za razčlenitev SOAP-a na brezžičnih platformah z omejenimi viri, kot je J2ME / CLDC, draga. Obstajajo tudi praktične težave:

  1. Lahka platforma J2ME / CLDC žrtvuje številne uporabne standardne Java funkcije zaradi velikosti in hitrosti. Posledično ima platforma J2ME / CLDC le omejeno funkcionalnost nizov, kar je velika težava vsakega brezžičnega razčlenjevalnika Java XML.
  2. Razčlenjevanje SOAP zahteva, da razčlenjevalnik prebere celoten dokument v pomnilnik. Toda večina razčlenjevalnikov J2ME / CLDC je pomnilniško učinkovitih linearnih razčlenjevalnikov SAX, ki nikoli ne gradijo objektnih modelov v pomnilniku.
  3. Platforma J2ME / CLDC nima podpore za nekatere osnovne podatkovne tipe, kot je Float tip.

Na srečo projekt kSOAP rešuje te težave in ponuja rešitev SOAP za majhne naprave.

kSOAP na pomoč

Na podlagi svojega priznanega generičnega razčlenjevalnika XML kXML je Enhydra.org začel odprtokodni projekt za razčlenitev SOAP na platformah J2ME / MIDP - projekt kSOAP. Del projekta EnhydraME je kSOAP napisala skupina razvijalcev pod vodstvom Stefana Hausteina. Enhydra je prvo različico alfa kSOAP izdal maja 2001. Po letu razvoja kSOAP, ki je zdaj v različici 1.2, podpira osnovni nabor funkcionalnosti SOAP 1.2. Primeri in razprave v tem članku se nanašajo na različico kSOAP 0.95 in novejšo različico (za celotno izvorno kodo glejte Viri). Koda deluje v okolju MIDP; če ste nov v razvoju MIDP ali morate osvežiti svoje sposobnosti, glejte serijo Michaela Cymermana "Programiranje naprav z MIDP".

Ta segment kode razčleni primere Hello World z uporabo kSOAP:

ByteArrayInputStream bis = novo ByteArrayInputStream (mesg.getBytes ()); InputStreamReader čitalec = nov InputStreamReader (bis); XmlParser xp = nov XmlParser (bralnik); // Uporabi privzeto preslikavo med predmeti Java in elementi mila. SoapEnvelope ovojnica = nova SoapEnvelope (nova ClassMap (Soap.VER12)); ovojnica.parse (xp); 

Spremenljivka niza mesg shrani celoten dokument SOAP.

Zdaj moramo sporočilo pridobiti iz razčlenjenega SOAP-a ovojnico. Naslednja koda pridobi prvega podrejenega pod SOAP Telo element:

// Za Hello World Listing 1 String rezultat = (String) envelope.getBody (); 

Ko se uporablja za Hello World Listing 1, rezultat vsebuje vrednost niza Pozdravljen, svet.

Ta naslednji kodni segment pridobi prvega vnuka pod SOAP Telo element:

// Za Hello World Listing 2 String rezultat = (String) envelope.getResult (); 

The SoapEnvelope.getResult () metoda priročno pridobi vrednosti iz odzivnih sporočil SOAP RPC, kot je Hello World v seznamu 2. Vendar, kot sem že dejal, bistvena vrednost razčlenjevalnika SOAP ni v njegovi zmožnosti pridobivanja besedilnih nizov iz dokumenta SOAP, temveč v njegovi sposobnosti preslikave SOAP Elementi XML v objekte Java. Preučimo, kako kSOAP doseže to preslikavo.

struktura objektov kSOAP

V sporočilu SOAP so elementi xsi: vrsta atribut podaja podatkovni tip vsebine elementa XML. Na primer, 123 določa celoštevilčno vrednost 123 in 123 določa vrednost niza "123".

kSOAP samodejno preslika štiri tipe SOAP v vrste Java v skladu z naslednjim seznamom:

Privzeto preslikava tipa
Tip milaVrsta Java
xsd: intjava.lang.Integer
xsd: dolgjava.lang.Long
xsd: nizjava.lang.String
xsd: logična vrednostjava.lang.Boolean
$config[zx-auto] not found$config[zx-overlay] not found