Programiranje

SAAJ: Niso pritrjeni nizi

V času pisanja tega članka je večina spletnih storitev sestavljena iz preprostih izmenjav sporočil: odjemalec stopi v stik s spletno storitvijo in ji pošlje sporočilo. Spletna storitev nato obdela to zahtevo in nato stranki pošlje odgovor nazaj. Ta preprost vzorec zahteve / odziva modelira način, kako protokol HTTP olajša interakcije med odjemalcem in spletnim strežnikom. Tako kot pri HTTP mora tudi pri izmenjavi sporočil spletnih storitev pogosto biti vključena binarna vsebina, na primer slike, dokumenti ali zvočni posnetki. Ta članek predstavlja pošiljanje in prejemanje vsebine binarnih spletnih storitev z uporabo SOAP (Simple Object Access Protocol) z API-jem prilog za Java (SAAJ) 1.2.

Preden se poglobite v zapletenosti prenosa vsebine binarnih spletnih storitev, velja poudariti, da je preprosta spletna storitev v obliki zahteve / odziva v nasprotju s storitvami, ki modno interakcijo odjemalec / strežnik oblikujejo kot oddaljeni klic ali RPC. V RPC strežnik razkrije vmesnik, ki je podoben API-ju. Po drugi strani odjemalec prikliče takšno storitev tako, da na API-ju storitve izvede oddaljene klice, posreduje zahtevane parametre in prejme vrednosti, ki jih ustvari klic.

RPC, ki temelji na XML, je podoben načinu, kako prikličete predmete v objektno usmerjenem (OO) sistemu. Pri delu z Java API-jem za RPC, ki temelji na XML (JAX-RPC), se le redko zavedate, da delate z dokumenti XML in ne z objekti Java. JAX-RPC vam omogoča, da o spletnih storitvah razmišljate kot o oddaljenih predmetih, podobno kot bi to storili z Java RMI (Remote Method Invocation). Izvajalno okolje JAX-RPC prevede klice metode OO na visoki ravni v dokumente XML, ki jih pričakuje oddaljena spletna storitev. Medtem ko spletne storitve v slogu RPC pogosto nudijo bolj priročen programski model, se morajo klici RPC za izmenjavo sporočil XML, ki tvorijo oddaljeni klic, zanašati tudi na nižjo raven sporočil.

Pri nekaterih spletnih storitvah je pogosto koristno neposredno programiranje na spodnjo raven sporočil. Če želite na primer priklicati spletno storitev, ki porabi dokument o naročilu in vrne potrdilo, lahko to izmenjavo dokumentov enostavno modelirate kot eno samo izmenjavo zahtev / odgovorov. Namesto da bi izvajali oddaljene klice metod, bi ustvarili sporočila XML, jih poslali neposredno v spletno storitev in obdelali odziv storitve XML, če ta obstaja. Ker SOAP definira skupno obliko sporočil za sporočila spletnih storitev, boste morali zgraditi sporočila, ki ustrezajo SOAP, in ko bo storitev odgovorila, razčleniti ta odzivna sporočila SOAP nazaj v obliko, ki jo razume vaš program.

SAAJ ponuja priročno knjižnico za sestavljanje in branje sporočil SOAP in vam omogoča tudi pošiljanje in prejemanje sporočil SOAP po omrežju. SAAJ definira imenski prostor javax.xml.soap. Razredi, ki se nahajajo v tem paketu, so bili sprva del Java API-ja za sporočanje XML (JAXM), vendar so bili pred kratkim ločeni v svoj API. JAXM se pri gradnji in manipulaciji sporočil SOAP zanaša na SAAJ ter dodaja zanesljivost sporočil in druge funkcije, značilne za sporočanje XML. Medtem ko je SAAJ obvezna komponenta J2EE (Java 2 Platform, Enterprise Edition) 1.4, JAXM ni. Ta članek se osredotoča na enega najbolj uporabnih vidikov SAAJ: zmožnost pripenjanja binarne vsebine sporočilu SOAP.

Prednosti priponk

Medtem ko se oblikovalsko središče SOAP osredotoča na inkapsulacijo dokumentov XML v sporočilu, funkcija priloge SOAP razširja sporočilo SOAP, tako da poleg običajnega dela SOAP vključuje nič ali več prilog, kot prikazuje slika 1. Vsaka priloga je definirana s tipom MIME in lahko prevzame katero koli vsebino, ki je predstavljena kot bajtni tok.

Funkcija priloge SOAP se izkaže za najbolj uporabno, kadar želi odjemalec poslati binarne podatke, kot so slikovni ali zvočni podatki, v spletno storitev. Brez prilog SOAP bi bilo pošiljanje kosa binarnih podatkov težje. Na primer, sporočilo SOAP stranke lahko posreduje naslov URL binarne datoteke. Nato bi moral odjemalec upravljati strežnik HTTP, da bi spletna storitev lahko naložila to datoteko. To bi predstavljalo neupravičeno breme za katerega koli odjemalca spletnih storitev, zlasti za odjemalce, ki delujejo na napravah z omejenimi viri, kot so digitalni fotoaparati ali optični bralniki. Zmogljivost priloge SOAP omogoča, da kateri koli odjemalec spletnih storitev, ki lahko prenaša sporočila SOAP, vdela binarne datoteke neposredno v sporočilo SOAP.

Priloge SOAP se na primer izkažejo za koristne pri interakciji s spletnimi stranmi portala. Razmislite o mreži nepremičninskih agencij, ki mora distribuirati opise in fotografije prodanih domov na centralizirani portal za iskanje nepremičnin. Če portal poslužuje strežniški programček, ki omogoča objavljanje sporočil SOAP s prilogami, lahko nepremičninska agencija svoje sezname posodobi z nekaj sporočili SOAP, vključno s fotografijami teh domov. Telo sporočila SOAP lahko vdela opis lastnosti, priloge SOAP pa lahko vsebujejo slikovne datoteke. V tem primeru bi servlet operaterja portala, ko prejme takšno sporočilo, vrnil potrditveni dokument z navedbo razpoložljivosti objave na portalu. Slika 2 prikazuje takšno spletno storitev.

Anatomija SOAP-a s sporočilom o prilogah

Sporočila SOAP s prilogami W3C (World Wide Web Consortium) Opomba (glejte Viri) SOAP-u ne dodaja novih funkcij. Namesto tega določa, kako izkoristiti vrste MIME v sporočilu SOAP za določanje prilog in kako se sklicevati na te priloge znotraj telesa SOAP.

Vrsta MIME večdelna / sorodna opredeljuje dokumente, sestavljene iz več povezanih delov. Sporočila SOAP s prilogami morajo slediti večdelna / sorodna Vrsta MIME. Spodnji primer prikazuje a večdelna / sorodna Sporočilo SOAP, vezano na protokol HTTP, z dvema priponkama:

POST / propertyListing HTTP / 1.1 Gostitelj: www.realproperties.com Vrsta vsebine: večdelna / sorodna; meja = MIME_boundary; vrsta = besedilo / xml; Content-Length: NNNN --MIME_boundary Content-Type: text / xml; charset = UTF-8 Content-Transfer-Encoding: 8bit Content-ID: Really Nice Homes, Inc. Dodaj 1234 Main St Pleasantville CA 94323 250000 --MIME_boundary Content-Type: image / jpeg Content-ID: .... JPEG DATA ..... --MIME_boundary Content-Type: image / jpeg Content-ID: .... JPEG DATA ..... --MIME_boundary-- 

Zgornje večdelno sporočilo vsebuje vrsto glav MIME in s tem povezanih podatkov. V korenu dokumenta je telo SOAP. Ker telo SOAP vsebuje samo podatke XML, je vrsta sporočila MIME celotno besedilo / xml. Za ovojnico SOAP sta dve prilogi, od katerih vsaka ustreza slikovni datoteki, poslani skupaj s sporočilom.

Content ID identificira vsako prilogo. Opomba W3C dovoljuje, da se ID priloge ali lokacija vsebine sklicuje na priloge, vendar daje prednost prejšnjim. Takšni ID-ji vsebine delujejo kot sklici na enotni identifikator virov (URI) na priloge; pravila kodiranja SOAP 1.1 določajo, kako se sklicevati na vir v sporočilu SOAP prek URI-ja, ki se lahko sklicuje na katero koli vsebino, ne le na XML (glejte 5. poglavje SOAP 1.1 v programu Resources). Procesor SOAP razreši te reference URI, ko obdeluje sporočilo. Na podlagi zgornjega primera procesor SOAP element poveže frontImage s podatkovnim odsekom z Content ID [email protected] v sporočilu SOAP.

Ustvarite in pošljite sporočilo SOAP s prilogami

SAAJ vam omogoča ustvarjanje in urejanje katerega koli dela sporočila SOAP, vključno s prilogami. Večina SAAJ temelji na abstraktnih razredih in vmesnikih, tako da lahko vsak ponudnik SAAJ implementira v svoje izdelke. Referenčna izvedba Sun Microsystems je priložena paketu za razvijalce spletnih storitev Java (JWSDP).

Ker so sporočila SOAP le posebna oblika dokumentov XML, JAAS gradi na API-ju dokumentnega objektnega modela (DOM) za obdelavo XML. Večina komponent sporočil SOAP izvira iz javax.xml.soap.Node vmesnik, ki pa je a org.w3c.dom.Node podrazred. Podrazredi SAAJ Vozlišče za dodajanje konstruktov, značilnih za SOAP. Na primer posebna Vozlišče, MILO Element, predstavlja element sporočila SOAP.

Neposreden rezultat zanašanja SAAJ na vmesnike in abstraktne razrede je, da večino nalog, povezanih s SOAP, izvajate s tovarniškimi metodami. Če želite aplikacijo povezati s SAAJ API, najprej ustvarite SOAPConnection od SOAPConnectionFactory. Za ustvarjanje in urejanje sporočil SOAP lahko tudi inicializirate MessageFactory in a MILO Tovarna. MessageFactory omogoča ustvarjanje sporočil SOAP in MILO Tovarna ponuja metode za ustvarjanje posameznih delov sporočila SOAP:

SOAPConnectionFactory spConFactory = SOAPConnectionFactory.newInstance (); SOAPConnection con = spConFactory.createConnection (); SOAPFactory soapFactory = SOAPFactory.newInstance (); 

S temi orodji lahko ustvarite sporočilo SOAP, ki ga bo stranka iz nepremičninske agencije uporabila za pošiljanje posodobitve seznama na spletno mesto portala.

SAAJ ponuja več načinov za ustvarjanje novega sporočila SOAP. Naslednji primer prikazuje najpreprostejšo metodo, ki ustvari prazno sporočilo SOAP z ovojnico ter glavo in telesom v tej ovojnici. Ker v tem sporočilu ne potrebujete glave SOAP, lahko ta element odstranite iz sporočila:

Sporočilo SOAPMessage = factory.createMessage (); Glava SOAPHeader = message.getSOAPHeader (); header.detachNode (); 

Dodajanje strukture XML telesu sporočila se izkaže za enostavno:

SOAPBody body = message.getSOAPBody (); Ime listingElementName = soapFactory.createName ("propertyListing", "realProperty", "//schemas.realhouses.com/listingSubmission"); SOAPBodyElement listingElement = body.addBodyElement (listingElementName); Ime attname = soapFactory.createName ("id"); listingElement.addAttribute (attname, "property_1234"); SOAPElement listingAgency = listingElement.addChildElement ("listingAgency"); listingAgency.addTextNode ("Res lepi domovi, Inc"); SOAPElement listingType = listingElement.addChildElement ("listingType"); listingType.addTextNode ("dodaj"); SOAPElement propertyAddress = listingElement.addChildElement ("propertyAddress"); SOAPElement street = propertyAddress.addChildElement ("ulica"); street.addTextNode ("1234 Main St"); SOAPElement city = propertyAddress.addChildElement ("mesto"); city.addTextNode ("Pleasantville"); SOAPElement stanje = propertyAddress.addChildElement ("stanje"); state.addTextNode ("CA"); SOAPElement zip = propertyAddress.addChildElement ("zip"); zip.addTextNode ("94521"); SOAPElement listPrice = listingElement.addChildElement ("listPrice"); listPrice.addTextNode ("25000"); 

Upoštevajte, da dodate edinstveni ID lastnosti kot atribut propertyListing element. Nadalje ste upravičeni do propertyListing element z a QNameali ime, ki pozna ime.

Sporočilu SOAP lahko priloge dodate na več načinov. V tem primeru najprej ustvarite elemente, ki označujejo sprednjo in notranjo sliko navedene lastnosti. Vsak ima href atribut, ki označuje ID vsebine priloge:

String frontImageID = "[email protected]"; SOAPElement frontImRef = listingElement.addChildElement ("frontImage"); Ime hrefAttName = soapFactory.createName ("href"); frontImRef.addAttribute (hrefAttName, frontImageID); String interiorID = "[email protected]"; SOAPElement interiorImRef = listingElement.addChildElement ("interiorImage"); interiorImRef.addAttribute (hrefAttName, interiorID); 

Če želite sporočilu enostavno priložiti zahtevane slikovne datoteke, uporabite a javax.activation.DataHandler objekt iz JavaBeans Activation Framework. DataHandler lahko samodejno zazna podatkovni tip, ki mu je bil poslan, in zato lahko prilogi samodejno dodeli ustrezen tip vsebine MIME:

URL URL = nov URL ("datoteka: ///export/files/pic1.jpg"); DataHandler dataHandler = nov DataHandler (url); AttachmentPart att = message.createAttachmentPart (dataHandler); att.setContentId (frontImageID); message.addAttachmentPart (att); 

Druga možnost je, da lahko prenesete Predmet, skupaj s pravilno vrsto MIME, do createAttachmentPart (). Ta metoda je podobna prvi. Interno bo izvajanje SAAJ verjetno iskalo a DataContentHandler za obdelavo določene vrste MIME. Če ne najde ustreznega vodnika, createAttachmentPart () bo vrgel IllegalArgumentException:

URL url2 = nov URL ("datoteka: ///export/files/pic2.jpg"); Slika im = Toolkit.getDefaultToolkit (). CreateImage (url2); AttachmentPart att2 = message.createAttachmentPart (im, "image / jpeg"); att2.setContentId (interiorID); message.addAttachmentPart (att2); 
$config[zx-auto] not found$config[zx-overlay] not found