Programovanie

SAAJ: Nie sú pripojené žiadne struny

V čase písania tohto článku väčšina webových služieb pozostáva z jednoduchých výmen správ: Klient kontaktuje webovú službu a odošle jej správu. Webová služba zase spracuje túto požiadavku a potom pošle späť odpoveď klientovi. Tento jednoduchý vzor požiadavka / odpoveď modeluje spôsob, akým protokol HTTP uľahčuje interakcie klient / webový server. Rovnako ako protokol HTTP, výmeny správ webových služieb musia často obsahovať binárny obsah, napríklad obrázky, dokumenty alebo zvukové klipy. Tento článok predstavuje odosielanie a prijímanie obsahu binárnych webových služieb pomocou protokolu SOAP (Simple Object Access Protocol) s rozhraním Attachments API for Java (SAAJ) 1.2.

Predtým, ako sa ponoríte do zložitosti prenosu obsahu binárnych webových služieb, stojí za to poukázať na to, že jednoduchá webová služba v štýle požiadavky / odpovede kontrastuje so službami, ktoré vytvárajú interakciu medzi klientom a serverom ako vzdialené volania procedúr alebo RPC. V RPC server vystavuje rozhranie podobné API. Klient zase vyvolá takúto službu uskutočnením vzdialených hovorov na API služby, odovzdaním požadovaných parametrov a prijatím hodnôt, ktoré volanie produkuje.

RPC založené na XML sa podobá spôsobu, akým vyvolávate objekty v objektovo orientovanom systéme (OO). Pri práci s rozhraním Java API pre XML založené na RPC (JAX-RPC) si málokedy uvedomíte, že pracujete s dokumentmi XML, nie s objektmi Java. JAX-RPC vám umožní myslieť na webové služby ako na vzdialené objekty, podobne ako by to bolo v prípade Java RMI (Remote Method Invocation). Modul runtime JAX-RPC prevádza volania metód OO na vysokej úrovni na dokumenty XML očakávané vzdialenou webovou službou. Zatiaľ čo webové služby v štýle RPC často poskytujú pohodlnejší programovací model, volania RPC sa musia pri výmene správ XML, ktoré tvoria vzdialené volanie, spoliehať aj na vrstvu správ na nižšej úrovni.

Pre niektoré webové služby je často užitočné priamo programovať na túto vrstvu správ na nižšej úrovni. Napríklad, ak chcete vyvolať webovú službu, ktorá spotrebúva doklad o objednávke a vracia potvrdenku, môžete túto výmenu dokumentov jednoducho modelovať ako jednu výmenu správ s požiadavkou / odpoveďou. Namiesto vzdialeného vyvolania metód by ste mali vytvoriť správy XML, odoslať ich priamo do webovej služby a spracovať odpoveď XML služby, ak existuje. Pretože SOAP definuje spoločný formát správ pre správy webovej služby, budete musieť vytvoriť správy vyhovujúce protokolu SOAP a akonáhle služba odpovie, tieto správy s odpoveďou SOAP musíte analyzovať späť do formátu, ktorému váš program rozumie.

SAAJ poskytuje pohodlnú knižnicu na vytváranie a čítanie správ SOAP a tiež vám umožňuje odosielať a prijímať správy SOAP v sieti. SAAJ definuje priestor mien javax.xml.soap. Triedy, ktoré sa nachádzajú v tomto balíku, pôvodne tvorili súčasť rozhrania Java API pre XML Messaging (JAXM), ale nedávno boli rozdelené do ich vlastných rozhraní API. JAXM sa pri konštrukcii a manipulácii so správami SOAP spolieha na SAAJ a dodáva spoľahlivosť správ a ďalšie funkcie špecifické pre zasielanie správ XML. Zatiaľ čo SAAJ je požadovanou súčasťou J2EE (Java 2 Platform, Enterprise Edition) 1.4, JAXM nie je. Tento článok sa zameriava na jeden z najužitočnejších aspektov SAAJ: schopnosť pripájať binárny obsah k správe SOAP.

Výhody príloh

Zatiaľ čo sa návrhové centrum SOAP zameriava na zapuzdrenie dokumentov XML do správy, funkcia prílohy SOAP rozširuje správu SOAP tak, aby okrem bežnej časti SOAP obsahovala aj nulu alebo viac príloh, ako ukazuje obrázok 1. Každá príloha je definovaná typom MIME a môže obsahovať akýkoľvek obsah reprezentovaný ako bajtový prúd.

Funkcia pripojenia protokolu SOAP sa ukáže ako najužitočnejšia, keď si klient želá prenášať binárne údaje, napríklad obrazové alebo zvukové údaje, do webovej služby. Bez príloh SOAP by sa posielanie binárnych údajov ukázalo ako zložitejšie. Napríklad správa SOAP klienta by mohla sprostredkovať adresu URL binárneho súboru. Klient by potom musel prevádzkovať server HTTP, aby umožnil webovej službe načítať tento súbor. To by predstavovalo neprimeranú záťaž pre každého klienta webových služieb, najmä pre klientov bežiacich na zariadeniach s obmedzenými zdrojmi, ako sú digitálne fotoaparáty alebo skenery. Schopnosť prílohy SOAP umožňuje každému klientovi webových služieb, ktorý je schopný prenášať správy SOAP, vkladať binárne súbory priamo do správy SOAP.

Napríklad prílohy SOAP sa osvedčia pri interakcii s webovými stránkami portálu. Zvážte sieť realitných kancelárií, ktorá musí distribuovať popisy a fotografie domov na predaj do centralizovaného portálu na vyhľadávanie nehnuteľností. Ak portál prevádzkuje servlet umožňujúci zverejňovanie správ SOAP s prílohami, realitná kancelária by mohla aktualizovať svoje zoznamy niekoľkými správami SOAP vrátane fotografií týchto domov. Telo správy SOAP môže obsahovať popis vlastnosti a prílohy SOAP môžu niesť obrazové súbory. Podľa tohto scenára, keď servlet operátora portálu prijme takúto správu, vráti dokument s potvrdením označujúci dostupnosť príspevku na portáli. Obrázok 2 zobrazuje takúto webovú službu.

Anatómia protokolu SOAP s prílohami

Správy SOAP s prílohami Poznámka W3C (World Wide Web Consortium) (pozri Zdroje) nepridáva do protokolu SOAP nové funkcie. Namiesto toho definuje, ako využiť typy MIME v správe SOAP na definovanie príloh a ako odkazovať na tieto prílohy z tela SOAP.

Typ MIME viacdielne / súvisiace definuje dokumenty pozostávajúce z viacerých súvisiacich častí. Správy SOAP s prílohami musia zodpovedať znakom viacdielne / súvisiace Typ MIME. Nasledujúci príklad ukazuje a viacdielne / súvisiace Správa SOAP viazaná na protokol HTTP s dvoma prílohami:

POST / zoznam nehnuteľností HTTP / 1.1 Hostiteľ: www.realproperties.com Typ obsahu: Viacdielny / Súvisiaci; hranica = MIME_boundary; typ = text / xml; Content-Length: NNNN --MIME_boundary Content-Type: text / xml; charset = UTF-8 Content-Transfer-Encoding: 8bit Content-ID: Really Nice Homes, Inc. Add 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-- 

Vyššie uvedená viacdielna správa obsahuje sériu MIME hlavičiek a súvisiacich údajov. V koreňovej časti dokumentu je telo protokolu SOAP. Pretože telo SOAP obsahuje iba údaje XML, je typ MIME celej správy text / xml. Za obálkou SOAP nasledujú dve prílohy, z ktorých každá zodpovedá obrazovému súboru odoslanému spolu so správou.

ID obsahu identifikuje každú prílohu. Poznámka W3C umožňuje odkazovať na prílohy buď ID obsahu alebo umiestnenie obsahu, dáva však prednosť predošlému. Takéto ID obsahu fungujú ako odkazy na prílohy k jednotnému identifikátoru zdroja (URI); pravidlá kódovania SOAP 1.1 definujú, ako odkazovať na zdroj v správe SOAP cez URI, ktorý môže odkazovať na akýkoľvek obsah, nielen na XML (pozri oddiel 5 protokolu SOAP 1.1 v časti Zdroje). Procesor SOAP rieši tieto odkazy URI pri spracovaní správy. Na základe vyššie uvedeného príkladu procesor SOAP asociuje prvok frontImage v sekcii údajov s Content ID [email protected] v správe SOAP.

Vytvorte a odošlite správu SOAP s prílohami

Program SAAJ vám umožňuje vytvárať a upravovať ľubovoľné časti správy SOAP vrátane príloh. Väčšina SAAJ je založená na abstraktných triedach a rozhraniach, takže každý poskytovateľ môže implementovať SAAJ do svojich vlastných produktov. Referenčná implementácia spoločnosti Sun Microsystems je dodávaná s balíkom Java Web Services Developer Pack (JWSDP).

Pretože správy SOAP predstavujú iba špeciálnu formu dokumentov XML, JAAS stavia na spracovaní XML na API Document Object Model (DOM). Väčšina komponentov správy SOAP pochádza z javax.xml.soap.Node rozhranie, ktoré je zase a org.w3c.dom.Node podtrieda. Podtriedy SAAJ Uzol na pridanie konštruktov špecifických pre SOAP. Napríklad špeciálny Uzol, SOAPElement, predstavuje prvok správy SOAP.

Priamym výsledkom spoliehania SAAJ na rozhrania a abstraktné triedy je, že väčšinu úloh súvisiacich s protokolom SOAP plníte pomocou továrenských metód. Ak chcete pripojiť svoju aplikáciu k SAAJ API, najskôr vytvorte a Pripojenie SOAP od a SOAPConnectionFactory. Na vytváranie a úpravy správ SOAP môžete tiež inicializovať a MessageFactory a a SOAPFactory. MessageFactory umožňuje vytvárať správy SOAP a SOAPFactory poskytuje metódy na vytvorenie jednotlivých častí správy SOAP:

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

Pomocou týchto nástrojov môžete vytvoriť správu SOAP, ktorú by klient z realitnej kancelárie použil na odoslanie aktualizácie záznamu na web portálu.

SAAJ ponúka niekoľko spôsobov, ako vytvoriť novú správu SOAP. Nasledujúci príklad ukazuje najjednoduchšiu metódu, ktorá vytvorí prázdnu správu SOAP s obálkou a hlavičkou a telom v tejto obálke. Pretože v tejto správe nepotrebujete hlavičku SOAP, môžete tento prvok zo správy odstrániť:

Správa SOAPMessage = factory.createMessage (); Hlavička SOAPHeader = message.getSOAPHeader (); header.detachNode (); 

Pridanie štruktúry XML do tela správy sa ukazuje ako priame:

SOAPBody body = message.getSOAPBody (); Názov listingElementName = soapFactory.createName ("propertyListing", "realProperty", "//schemas.realhouses.com/listingSubmission"); SOAPBodyElement listingElement = body.addBodyElement (listingElementName); Meno attname = soapFactory.createName ("id"); listingElement.addAttribute (attname, "property_1234"); SOAPElement listingAgency = listingElement.addChildElement ("listingAgency"); listingAgency.addTextNode ("Really Nice Homes, Inc"); SOAPElement listingType = listingElement.addChildElement ("listingType"); listingType.addTextNode ("pridať"); SOAPElement propertyAddress = listingElement.addChildElement ("propertyAddress"); SOAPElement street = propertyAddress.addChildElement ("ulica"); street.addTextNode ("1234 Main St"); SOAPElement city = propertyAddress.addChildElement ("mesto"); city.addTextNode ("Pleasantville"); SOAPElement state = propertyAddress.addChildElement ("state"); state.addTextNode ("CA"); SOAPElement zip = propertyAddress.addChildElement ("zip"); zip.addTextNode ("94521"); SOAPElement listPrice = listingElement.addChildElement ("listPrice"); listPrice.addTextNode ("25000"); 

Upozorňujeme, že k atribútu. Pridáte jedinečné ID nehnuteľnosti ako atribút zoznam nehnuteľností element. Ďalej spĺňate podmienky zoznam nehnuteľností prvok s a QNamealebo názov podporujúci priestor názvov.

Prílohy k správe SOAP môžete pridať niekoľkými spôsobmi. V tomto príklade najskôr vytvoríte prvky, ktoré označia predný a vnútorný obraz uvedenej nehnuteľnosti. Každý z nich má href atribút označujúci ID obsahu prílohy:

Reťazec frontImageID = "[email protected]"; SOAPElement frontImRef = listingElement.addChildElement ("frontImage"); Názov hrefAttName = soapFactory.createName ("href"); frontImRef.addAttribute (hrefAttName, frontImageID); Reťazec interiorID = "[email protected]"; SOAPElement interiorImRef = listingElement.addChildElement ("interiorImage"); interiorImRef.addAttribute (hrefAttName, interiorID); 

Ak chcete k správe ľahko pripojiť požadované obrazové súbory, použite a javax.activation.DataHandler objekt z JavaBeans Activation Framework. DataHandler dokáže automaticky zistiť dátový typ, ktorý mu bol odovzdaný, a môže tak automaticky priradiť vhodný typ obsahu MIME k prílohe:

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

Prípadne môžete prejsť okolo Objekt, spolu so správnym typom MIME, do createAttachmentPart (). Táto metóda sa podobá tej prvej. Interne bude implementácia SAAJ pravdepodobne hľadať a DataContentHandler na spracovanie zadaného typu MIME. Ak nenájde vhodného psovoda, createAttachmentPart () bude hádzať IllegalArgumentException:

URL url2 = nová URL ("file: ///export/files/pic2.jpg"); Obrázok im = Toolkit.getDefaultToolkit (). CreateImage (url2); AttachmentPart att2 = message.createAttachmentPart (im, "obrázok / jpeg"); att2.setContentId (ID interiéru); message.addAttachmentPart (att2); 
$config[zx-auto] not found$config[zx-overlay] not found