Programmēšana

SAAJ: Stīgas nav pievienotas

Šīs rakstīšanas laikā lielākā daļa tīmekļa pakalpojumu sastāv no vienkāršas ziņojumu apmaiņas: klients sazinās ar tīmekļa pakalpojumu un nosūta ziņojumu šim dienestam. Savukārt tīmekļa pakalpojums apstrādā šo pieprasījumu un pēc tam nosūta klientam atbildi. Šis vienkāršais pieprasījuma / atbildes modelis modelē veidu, kā HTTP protokols atvieglo klienta / tīmekļa servera mijiedarbību. Tāpat kā HTTP gadījumā, arī Web pakalpojuma ziņojumu apmaiņā bieži jāiekļauj binārs saturs, piemēram, attēli, dokumenti vai skaņas klipi. Šis raksts iepazīstina ar binārā tīmekļa pakalpojuma satura sūtīšanu un saņemšanu, izmantojot SOAP (vienkāršo objektu piekļuves protokolu) ar Java pielikumu API (SAAJ) 1.2.

Pirms ienirt binārā tīmekļa pakalpojuma satura pārsūtīšanas sarežģījumos, ir vērts norādīt, ka vienkāršs pieprasījuma / atbildes stila tīmekļa pakalpojums ir pretrunā ar pakalpojumiem, kas veido klienta / servera mijiedarbību kā attālās procedūras izsaukumus vai RPC. RPC serveris parāda saskarni, kas līdzinās API. Savukārt klients izsauc šādu pakalpojumu, veicot attālinātus zvanus uz pakalpojuma API, nododot nepieciešamos parametrus un saņemot zvana radītās vērtības.

Uz XML bāzes RPC atgādina veidu, kā objektus izsaucat objektorientētā (OO) sistēmā. Patiešām, strādājot ar Java API XML balstītai RPC (JAX-RPC), jūs reti uzzināt, ka strādājat ar XML dokumentiem, nevis Java objektiem. JAX-RPC ļauj domāt par tīmekļa pakalpojumiem kā par attāliem objektiem, tāpat kā ar Java RMI (Remote Method Invocation). JAX-RPC izpildlaiks tulko augsta līmeņa OO metodes izsaukumus uz XML dokumentiem, kurus sagaida attālais tīmekļa pakalpojums. Lai gan RPC stila tīmekļa pakalpojumi bieži nodrošina ērtāku programmēšanas modeli, RPC zvaniem ir jāpaļaujas arī uz zemāka līmeņa ziņojumapmaiņas slāni, lai apmainītos ar XML ziņojumiem, kas veido attālo zvanu.

Dažiem tīmekļa pakalpojumiem bieži ir lietderīgi tieši ieprogrammēt šo zemākā līmeņa ziņojumapmaiņas slāni. Piemēram, ja vēlaties izsaukt tīmekļa pakalpojumu, kas patērē pirkuma pasūtījuma dokumentu un atgriež kvīti, varat viegli modelēt šo dokumentu apmaiņu kā vienu pieprasījuma / atbildes ziņojumu apmaiņu. Tā vietā, lai izsauktu attālās metodes, jūs izveidotu XML ziņojumus, nosūtītu tos tieši Web pakalpojumam un apstrādātu pakalpojuma XML atbildi, ja tāda pastāv. Tā kā SOAP nosaka kopējo ziņojumu formātu tīmekļa pakalpojumu ziņojumiem, jums būs jākonstruē SOAP atbilstoši ziņojumi un, tiklīdz pakalpojums reaģēs, parsējiet šos SOAP atbildes ziņojumus atpakaļ jūsu saprotamajā formātā.

SAAJ nodrošina ērtu bibliotēku SOAP ziņojumu izveidošanai un lasīšanai, kā arī ļauj nosūtīt un saņemt SOAP ziņojumus visā tīklā. SAAJ nosaka nosaukumvietu javax.xml.soap. Klases, kas atrodas šajā paketē, sākotnēji bija daļa no Java API for XML Messaging (JAXM), taču nesen tika sadalītas savā API. JAXM paļaujas uz SAAJ, veidojot SOAP ziņojumus un manipulējot ar tiem, un pievieno ziņojumu uzticamību un citas XML ziņojumapmaiņai raksturīgās funkcijas. Tā kā SAAJ ir obligāta J2EE (Java 2 Platform, Enterprise Edition) 1.4 sastāvdaļa, JAXM nav. Šis raksts koncentrējas uz vienu no SAAJ visnoderīgākajiem aspektiem: spēju pievienot bināro saturu SOAP ziņojumam.

Pielikumu priekšrocības

Kamēr SOAP dizaina centrs koncentrējas uz XML dokumentu iekapsulēšanu ziņojumā, SOAP pielikuma funkcija paplašina SOAP ziņojumu, lai papildus parastajai SOAP daļai iekļautu arī nulles vai vairāk pielikumus, kā parādīts 1. attēlā. Katru pielikumu nosaka MIME tips, un tajā var uzņemties jebkuru saturu, kas attēlots kā baitu straume.

SOAP pielikuma funkcija izrādās visnoderīgākā, ja klients vēlas nosūtīt bināros datus, piemēram, attēlu vai audio datus, uz tīmekļa pakalpojumu. Bez SOAP pielikumiem bināro datu gabala nosūtīšana izrādīsies sarežģītāka. Piemēram, klienta SOAP ziņojums varētu nosūtīt binārā faila URL adresi. Pēc tam klientam būtu jālieto HTTP serveris, lai ļautu tīmekļa pakalpojumam izgūt šo failu. Tas radītu nepamatotu slogu jebkuram tīmekļa pakalpojumu klientam, it īpaši klientiem, kuri darbojas ar ierobežotu resursu ierīcēm, piemēram, digitālajām kamerām vai skeneriem. SOAP pievienošanas iespējas ļauj jebkuram tīmekļa pakalpojumu klientam, kurš var pārsūtīt SOAP ziņojumus, bināros failus iegult tieši SOAP ziņojumā.

Piemēram, SOAP pielikumi ir noderīgi, mijiedarbojoties ar portāla vietnēm. Apsveriet nekustamā īpašuma aģentūru tīklu, kuram centralizētā nekustamā īpašuma meklēšanas portālā ir jāizplata pārdodamo māju apraksti un fotogrāfijas. Ja portālā darbojas servlets, kas ļauj izlikt SOAP ziņojumus ar pielikumiem, nekustamā īpašuma aģentūra varētu atjaunināt savus ierakstus ar dažiem SOAP ziņojumiem, ieskaitot šo māju fotoattēlus. SOAP ziņojuma pamatteksts var iegult rekvizīta aprakstu, un ziepju pielikumi var saturēt attēlu failus. Saskaņā ar šo scenāriju, kad portāla operatora servleta saņem šādu ziņojumu, tas atgriezīs apstiprinājuma dokumentu, norādot ziņas pieejamību portālā. Šādu tīmekļa pakalpojumu ilustrē 2. attēls.

Ziepju anatomija ar pielikumu ziņojumu

Piezīme par SOAP ziņojumiem ar pielikumiem W3C (World Wide Web Consortium) (skat. Resursus) nepievieno jaunas iespējas SOAP. Drīzāk tas nosaka, kā izmantot MIME veidus SOAP ziņojumā, lai definētu pielikumus, un kā atsaukties uz šiem pielikumiem no SOAP pamatteksta.

MIME tips daudzdaļīgs / saistīts definē dokumentus, kas sastāv no vairākām saistītām daļām. SOAP ziņojumiem ar pielikumiem jāievēro daudzdaļīgs / saistīts MIME tips. Tālāk sniegtajā piemērā parādīts a daudzdaļīgs / saistīts SOAP ziņojums, kas saistīts ar HTTP protokolu, ar diviem pielikumiem:

POST / propertyListing HTTP / 1.1 Host: www.realproperties.com Content-Type: Multipart / Related; robeža = MIME_boundary; type = text / xml; Content-Length: NNNN - MIME_boundary Content-Type: text / xml; charset = UTF-8 Satura pārsūtīšanas kodēšana: 8 bitu Content-ID: Really Nice Homes, Inc. Pievienojiet 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-- 

Iepriekš minētais daudzdaļīgais ziņojums satur virkni MIME galvenes un saistītos datus. Dokumenta pamatā ir SOAP pamatteksts. Tā kā SOAP pamattekstā ir tikai XML dati, visa ziņojuma MIME tips ir teksts / xml. Pēc SOAP aploksnes ir divi pielikumi, no kuriem katrs atbilst attēla failam, kas nosūtīts kopā ar ziņojumu.

Satura ID identificē katru pielikumu. W3C piezīme ļauj Content ID vai satura atrašanās vietai norādīt atsauces uz pielikumiem, taču tā dod priekšroku pirmajiem. Šādi satura ID darbojas kā vienota resursa identifikatora (URI) atsauces uz pielikumiem; SOAP 1.1 kodēšanas kārtulas nosaka, kā uz resursu atsaukties SOAP ziņojumā, izmantojot URI, kas var atsaukties uz jebkuru saturu, ne tikai uz XML (skat. resursu SOAP 1.1 5. sadaļu). SOAP procesors atrisina šīs URI atsauces, apstrādājot ziņojumu. Pamatojoties uz iepriekš minēto piemēru, SOAP procesors elementu saista priekšējais attēls ar datu sadaļu ar Content ID īpaš[email protected] ziepē.

Izveidojiet un nosūtiet SOAP ziņojumu ar pielikumiem

SAAJ ļauj jums izveidot un rediģēt jebkuru SOAP ziņojuma daļu, ieskaitot pielikumus. Lielākā daļa SAAJ ir balstīta uz abstraktām klasēm un saskarnēm, lai katrs pakalpojumu sniedzējs varētu ieviest SAAJ savos produktos. Sun Microsystems atsauces ieviešana nāk ar Java Web Services Developer Pack (JWSDP).

Tā kā SOAP ziņojumi ir tikai īpaša XML dokumentu forma, JAAS XML apstrādei izmanto dokumenta objekta modeļa (DOM) API. Lielākā daļa SOAP ziņojumu komponentu nāk no javax.xml.soap.Node interfeiss, kas, savukārt, ir a org.w3c.dom.Node apakšklase. SAAJ apakšklases Mezgls pievienot ziepēm specifiskas konstrukcijas. Piemēram, īpašs Mezgls, ZIEPESElement, apzīmē SOAP ziņojuma elementu.

SAAJ paļaušanās uz saskarnēm un abstraktajām klasēm ir tiešs rezultāts tam, ka jūs veicat lielāko daļu ar SOAP saistīto uzdevumu, izmantojot rūpnīcas metodes. Lai savienotu lietojumprogrammu ar SAAJ API, vispirms izveidojiet SOAP savienojums no a SOAPConnectionFactory. Lai izveidotu un rediģētu SOAP ziņojumus, varat arī inicializēt a MessageFactory un a ZIEPES Rūpnīca. MessageFactory ļauj izveidot SOAP ziņojumus un ZIEPES Rūpnīca nodrošina metodes atsevišķu SOAP ziņojuma daļu izveidei:

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

Izmantojot šos rīkus, varat izveidot SOAP ziņojumu, ko klients no nekustamā īpašuma aģentūras izmantotu, lai portāla vietnei nosūtītu saraksta atjauninājumu.

SAAJ piedāvā vairākus veidus, kā izveidot jaunu SOAP ziņojumu. Šajā piemērā parādīta vienkāršākā metode, kā izveidot tukšu SOAP ziņojumu ar aploksni, galveni un pamattekstu šajā aploksnē. Tā kā šajā ziņojumā nav nepieciešama SOAP galvene, varat noņemt šo elementu no ziņojuma:

SOAPMessage ziņojums = factory.createMessage (); SOAPHeader header = message.getSOAPHeader (); header.detachNode (); 

XML struktūras pievienošana ziņojuma pamattekstā izrādās vienkārša:

SOAPBody body = message.getSOAPBody (); Vārdu sarakstsElementName = soapFactory.createName ("propertyListing", "realProperty", "//schemas.realhouses.com/listingSubmission"); SOAPBodyElement listingElement = body.addBodyElement (listingElementName); Vārds 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 ("pievienot"); SOAPElement propertyAddress = listingElement.addChildElement ("propertyAddress"); SOAPElement iela = propertyAddress.addChildElement ("iela"); street.addTextNode ("1234 Main St"); SOAPElement pilsēta = propertyAddress.addChildElement ("pilsēta"); city.addTextNode ("Pleasantville"); SOAPElement stāvoklis = propertyAddress.addChildElement ("stāvoklis"); state.addTextNode ("CA"); SOAPElement zip = propertyAddress.addChildElement ("zip"); zip.addTextNode ("94521"); SOAPElement listPrice = listingElement.addChildElement ("listPrice"); listPrice.addTextNode ("25000"); 

Ņemiet vērā, ka pievienojat īpašuma unikālo ID kā atribūtu propertyListing elements. Turklāt jūs kvalificējaties propertyListing elements ar a QNamevai nosaukumvietu apzinošs nosaukums.

SOAP ziņojumam var pievienot pielikumus vairākos veidos. Šajā piemērā vispirms izveidojat elementus, lai apzīmētu uzskaitītā īpašuma priekšpuses un interjera attēlus. Katram no tiem ir href atribūts, kas apzīmē pielikuma satura ID:

String frontImageID = "īpaš[email protected]"; SOAPElement frontImRef = listingElement.addChildElement ("frontImage"); Vārds hrefAttName = soapFactory.createName ("href"); frontImRef.addAttribute (hrefAttName, frontImageID); String interiorID = "īpaš[email protected]"; SOAPElement interiorImRef = listingElement.addChildElement ("interiorImage"); interiorImRef.addAttribute (hrefAttName, interiorID); 

Lai ziņojumam ērti pievienotu nepieciešamos attēlu failus, izmantojiet a javax.activation.DataHandler objekts no JavaBeans aktivizācijas ietvara. DataHandler var automātiski noteikt tam nodoto datu tipu, un tāpēc pielikumam var automātiski piešķirt atbilstošo MIME satura tipu:

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

Alternatīvi, jūs, iespējams, varēsit iet garām Objektskopā ar pareizo MIME tipu uz createAttachmentPart (). Šī metode atgādina pirmo. Iekšēji SAAJ ieviešana, iespējams, meklēs DataContentHandler rīkoties ar norādīto MIME tipu. Ja tā nevar atrast piemērotu apdarinātāju, createAttachmentPart () iemetīs NelegālsArgumentException:

URL url2 = jauns URL ("file: ///export/files/pic2.jpg"); Attēls 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