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:
- 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ä.
- 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.
- 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:
- 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.
- 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.
- 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
|