Ohjelmointi

Käytä verkkopalveluja langattomilla laitteilla

Kuten keskustelin ensimmäisessä Langaton Java sarake "Java lukee itse langattomia verkkopalveluja varten", XML-käsittelyominaisuudet edustavat yhtä langattomien verkkopalvelusovellusten tärkeimmistä vaatimuksista. J2ME / MIDP (Java 2 Platform, Micro Edition / Mobile Information Device Profile Profile) -määrityksestä puuttuu kuitenkin vakio-XML-sovellusliittymät, joita ei myöskään sisälly tulevaan MIDP 2.0 -määritykseen. Tarvitsemme siis kolmannen osapuolen J2ME / CLDC (Connected Limited Device Configuration) -kirjastoja, jotka pystyvät käsittelemään XML-tiedostoja, erityisesti niitä verkkopalvelukohtaisia ​​XML-protokollia.

Tässä artikkelissa keskustelen siitä, miten verkkopalveluviestejä käsitellään avoimen lähdekoodin kSOAP-paketilla J2ME / MIDP-alustalla. Kuten monissa muissa yrityslaskenta-arkkitehtuureissa, verkkopalveluissa on mukana sekä asiakkaita että palvelimia. Koska monissa keskusteluissa keskitytään siihen, miten J2EE: tä (Java 2 Platform, Enterprise Edition) käytetään verkkopalvelujen kehittämiseen ja asentamiseen palvelinpuolella, keskityn tässä artikkelissa vain J2ME-asiakaspuoleen.

SOAP-etu

Tärkeä XML-protokolla verkkopalveluihin pääsemiseksi on SOAP (Simple Object Access Protocol). Kilpaileviin tekniikoihin verrattuna SOAP: lla on seuraavat edut:

  1. SOAP määrittelee yli 40 vakiotietotyyppiä XML-skeeman avulla ja antaa käyttäjien määrittää mukautetut monimutkaiset tietotyypit. Tällainen hienostunut tietotyyppinen tuki tekee SOAP: sta tehokkaan ja rikkaan kielen tiedonvaihtoon nykypäivän laajalti käytössä olevien olio-järjestelmien välillä.
  2. Vahvan datatyyppisen tuen lisäksi SOAP tukee myös erilaisia ​​viestintäjärjestelmiä. Näihin järjestelmiin kuuluvat synkroniset etäkäynnistyspuhelut (RPC), asynkroniset viestit, monilähetysviestit (tilaus) ja monimutkaiset viestireitit useiden välittäjien kanssa.
  3. Koska SOAP on saanut yleisen tuen verkkopalveluiden viestintätandardina, useimpien muiden verkkopalveluprotokollien on oltava yhteydessä SOAP: iin. Esimerkiksi WSDL (Web Services Description Language), UDDI (Universal Description, Discovery and Integration) ja useimmat XML-rekisterit tukevat SOAP: ia; XML-digitaalinen allekirjoitus, XML-salaus, SAML (Security Assertion Markup Language) ja muut suojatut XML-protokollat ​​tarjoavat kaikki tavallisen sidonnan SOAP: lla. Jokainen sidontaprotokolla tarjoaa syntaksin oman erikoiselementtinsä SOAP-viesteihin. SOAP: n täysi tuki XML-nimitiloille on helpottanut sitomista muihin protokolliin.

Edellä mainittujen etujen takia SOAP on jo eniten käytetty verkkopalvelujen viestintäprotokolla. Joten langattoman verkkopalvelusovelluksen perusvaatimus on kyky ymmärtää SOAP-viestejä. Katsotaan nyt joitain yksinkertaisia ​​SOAP-esimerkkejä. Listaus 1 kuvaa yksinkertaista, yleistä SOAP-sanomaa:

Listaus 1. Hello World SOAP -viesti

  Hei maailma 

SOAP on eniten käytetty verkkopalvelujen RPC: ssä. Verkkopalvelujen RPC: n SOAP-vastausviesti sisältää yleensä palautusarvot a: n sisällä Tulos SOAP-elementti Runko elementti. Listaus 2 näyttää yksinkertaisen SOAP RPC -vastaussanoman:

Listaus 2. Hello World SOAP RPC -viesti

   Hei maailma 

Koska meidän on käytettävä SOAP-viestejä ohjelmallisesti ohjelmissamme, tarvitsemme SOAP-jäsentimen.

Mikä on SOAP-jäsentely?

Jokainen nimitilan tuen sisältävä yleinen XML-jäsennin ymmärtää SOAP-sanomat ja voi poimia niistä tietoja. Teoriassa voimme aina poimia tekstitietoja SOAP-sanomasta käyttämällä yleistä XML-jäsennintä ja sitten muuntaa nämä tekstimerkkijonot Java-dataobjekteiksi, kun niitä on käytettävä. Esimerkiksi, int i = Kokonaisluku.parseInt ("123"); muuntaa tekstimerkkijonon "123" kokonaislukuun 123. Mutta tällainen manuaalinen muuntaminen rasittaa sovellusohjelmoijia. Java-dataobjektien purkaminen suoraan SOAP-sanomasta antaisi paremman lähestymistavan. Syötä SOAP-jäsennin.

SOAP-jäsennin on rakennettu geneeriselle XML-jäsentäjälle, jolla on erityiset tyyppikartoitus- ja tekstidatan muodostusmekanismit. SOAP-jäsennin ymmärtää SOAP-viestien tietotyyppitiedot ja muuntaa SOAP-viestin automaattisesti Java-dataobjekteiksi. Parserin todellinen arvo on, että se tarjoaa ohjelmoinnin läpinäkyvyyden Java-ohjelman ja SOAP-viestin välillä. Ohjelmoija syöttää Java-objektit vain SOAP-kirjoittajaan, lähettää viestin, odottaa palvelimen vastausta ja lukee sitten Java-objektit suoraan SOAP-jäsentimestä.

Kuten keskustelin, SOAP sisältää runsaasti toimintoja. Monet pitävät SOAP-jäsentämistukea resurssirajoitteisilla langattomilla alustoilla, kuten J2ME / CLDC, kalliina. Käytännön vaikeuksia on myös:

  1. Kevyt J2ME / CLDC -alusta uhraa monia hyödyllisiä Java-vakiotoimintoja koon ja nopeuden suhteen. Tämän seurauksena J2ME / CLDC -alustalla on vain rajoitettu merkkijonotoiminto, mikä on suuri ongelma jokaiselle langattomalle Java XML-jäsentäjälle.
  2. SOAP-jäsentäminen edellyttää, että jäsennin lukee koko asiakirjan muistiin. Mutta useimmat J2ME / CLDC-jäsentimet ovat muistia säästäviä lineaarisia SAX-jäsentimiä, jotka eivät koskaan rakenna muistissa olevia objektimalleja.
  3. J2ME / CLDC -alustalta puuttuu tuki joillekin perustietotyypeille, kuten Kellua tyyppi.

Onneksi projekti kSOAP ratkaisee nämä ongelmat ja tarjoaa SOAP-ratkaisun pienille laitteille.

kSOAP pelastukseen

Tunnetun avoimen lähdekoodin XML-jäsentimen kXML perusteella Enhydra.org on aloittanut avoimen lähdekoodin projektin SOAP-jäsentämiseen J2ME / MIDP-alustoilla - kSOAP-projektin. Osan EnhydraME-projektista kSOAP: n kirjoitti kehittäjäryhmä, jota johtaa Stefan Haustein. Enhydra julkaisi kSOAP: n ensimmäisen alfa-version toukokuussa 2001. Vuoden kehityksen jälkeen kSOAP, nyt versiossa 1.2, tukee SOAP 1.2 -toimintojen ydinsarjaa. Tämän artikkelin esimerkit ja arkkitehtuurikeskustelut koskevat kSOAP-versiota 0.95 ja sitä uudempia versioita (katso lähdekoodin kohdasta Resurssit). Koodi toimii MIDP-ympäristössä; Jos olet uusi MIDP-kehittäjä tai haluat päivittää taitosi, katso Michael Cymermanin sarja "Laiteohjelmointi MIDP: llä".

Tämä koodisegmentti jäsentää Hello World -esimerkkejä kSOAP: n avulla:

ByteArrayInputStream bis = uusi ByteArrayInputStream (mesg.getBytes ()); InputStreamReader Reader = uusi InputStreamReader (bis); XmlParser xp = uusi XmlParser (lukija); // Käytä oletuskartoitusta Java-objektien ja saippuaelementtien välillä SoapEnvelope kirjekuori = new SoapEnvelope (uusi ClassMap (Soap.VER12)); kirjekuori.parse (xp); 

Merkkijonomuuttuja mesg tallentaa koko SOAP-asiakirjan.

Nyt meidän on haettava viesti jäsennetystä SOAP: sta kirjekuori. Seuraava koodi hakee ensimmäisen lapsen SOAP: n alle Runko elementti:

// Hello World Listing 1 -merkkijonotulos = (Merkkijono) kirjekuori.getBody (); 

Kun sitä käytetään Hello World Listing 1: een, tulos sisältää merkkijonon arvon Hei maailma.

Tämä seuraava koodisegmentti hakee ensimmäisen lapsenlapsen SOAP: n alla Runko elementti:

// Hello World Listing 2 -merkkijonotulos = (Merkkijono) kirjekuori.getResult (); 

SoapEnvelope.getResult () menetelmä noutaa arvot kätevästi SOAP RPC -vastausviesteistä, kuten Hello World in Listing 2. Kuitenkin, kuten olen sanonut, SOAP-jäsentimen perusarvo ei ole sen kyvyssä noutaa tekstimerkkijonoja SOAP-dokumentista, vaan kyvyssä kartoittaa SOAP XML-elementit Java-objekteille. Tutkitaan, miten kSOAP saavuttaa kartoituksen.

kSOAP-objektien rakenne

SOAP-viestissä elementin xsi: tyyppi attribuutti määrittää XML-elementin sisällön tietotyypin. Esimerkiksi, 123 määrittää kokonaisluvun arvon 123 ja 123 määrittää merkkijonon arvon "123".

kSOAP kartoittaa neljä SOAP-tyyppiä automaattisesti Java-tyyppeihin seuraavan luettelon mukaisesti:

Oletustyyppikartoitus
SOAP-tyyppiJava-tyyppi
xsd: sisjava.lang.I kokonaisluku
xsd: pitkäjava.lang.pitkä
xsd: merkkijonojava.lang.String
xsd: looginenjava.lang.Boolean
$config[zx-auto] not found$config[zx-overlay] not found