国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

用SAAJ1.2發(fā)送接收二進(jìn)制Web服務(wù)內(nèi)容(二)

2019-11-18 12:52:26
字體:
供稿:網(wǎng)友

  帶有附件的SOAP分析
  帶有附件的SOAP信息并沒有給SOAP增加新的特征。 確切的說,它定義了如何利用在SOAP信息中MIME類型來定義附件, 并且還定義了如何引用在SOAP體(SOAP Body)中的那些附件。
  MIME類型的復(fù)合塊/關(guān)聯(lián)(multipart/related)特性能定義由多部分組成的一個文檔。帶有附件的SOAP信息一定要符合這樣的復(fù)合塊/關(guān)聯(lián)(multipart/related)的MIME類型。下面的例子展示了一個復(fù)合塊/關(guān)聯(lián)的 SOAP 信息,它被綁定到到 HTTP 協(xié)議,帶有兩個附件:
  
  POST /PRopertyListing HTTP/1.1
  Host: www.realproperties.com
  Content-Type: Multipart/Related; boundary=MIME_boundary; type=text/xml; start=""
  Content-Length: NNNN
  
  --MIME_boundary
  Content-Type: text/xml; charset=UTF-8
  Content-Transfer-Encoding: 8bit
  Content-ID:
  
  
  
  
  
         xmlns:realProperty="http://schemas.realhouses.com/listingSubmission";>
  
      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--
  
  上述的復(fù)合塊信息包含一系列的MIME頭和相關(guān)的數(shù)據(jù)。文件的底層是SOAP體(SOAP Body)。 因為SOAP體只包含XML數(shù)據(jù),整個信息的MIME類型是本文/xml(text/xml)類型 。 在SOAP封套(SOAP envelope)后面是二個附件,每個附件都包含一個連同信息一起發(fā)送的圖像文件。
  用內(nèi)容ID(Content ID)來識別每一個附件。W3C 備忘錄答應(yīng)用內(nèi)容ID或內(nèi)容位置來引用附件,但是它優(yōu)先選擇前者。這樣的一個內(nèi)容ID作為統(tǒng)一資源標(biāo)志符URI(Uniform Resource Identifier)引用給附件;SOAP 1.1的編碼規(guī)則定義了如何通過URI來引用SOAP信息里面的任何資源,不僅僅是引用XML( 參考SOAP1.1第5節(jié)資源)。當(dāng)SOAP處理機(jī)處理信息時,它會解析這些URI引用。在上述的例子中,SOAP處理器把元素frontImage關(guān)聯(lián)到內(nèi)容ID為property1234_front.jpeg@realhouses.com的數(shù)據(jù)段中。
  
  創(chuàng)建并發(fā)送帶有附件的SOAP信息
  SAAJ能讓你創(chuàng)建并編輯SOAP信息的任何部份, 包括附件。 大多數(shù)的SAAJ以抽象類和接口為基礎(chǔ),所以每個供給商都能實現(xiàn)它自己的SAAJ產(chǎn)品。Sun Microsystems公司的參考實現(xiàn)附在JWSDP包(java Web Services Developer Pack)中。
  因為SOAP信息只是XML文檔的一種非凡形式,JAAS在DOM(document.nbspObject Model)API的基礎(chǔ)上處理XML。大多數(shù)的SOAP信息組件派生自 avax.xml.soap.Node接口, 而這個接口又是org.w3c.dom.Node的子類。SAAJ繼續(xù)了Node來添加SOAP樣式的結(jié)構(gòu)。 舉例來說,這個非凡的Node, SOAPElement,代表了一個SOAP信息元素。
  SAAJ依靠于接口和抽象類的直接結(jié)果是:你要通過工廠方法(factory methods)來完成大多數(shù)與SOAP相關(guān)的工作。 要把你的程序鏈接到SAAJ API,你首先要創(chuàng)建一個來自工廠方法SOAPConnectionFactory的鏈接SOAPConnection。要創(chuàng)建和編輯SOAP信息,你可以初始化MessageFactory和SOAPFactory。MessageFactory能讓你產(chǎn)生SOAP信息,而 SOAPFactory則提供方法產(chǎn)生SOAP信息的各個部份:
  
  SOAPConnectionFactory spConFactory = SOAPConnectionFactory.newInstance();
  SOAPConnection con = spConFactory.createConnection();
  SOAPFactory soapFactory = SOAPFactory.newInstance();
  
  把這些工具用在適當(dāng)?shù)奈恢茫憔涂梢詣?chuàng)建一個 SOAP 信息,在前面的例子中,來自房產(chǎn)代理的客戶可以使用這些信息發(fā)送項目表更新給一個網(wǎng)站入口。
  SAAJ 提供了幾個方法來產(chǎn)生一個新的 SOAP 信息。 下面例子演示了用最簡單的方法來創(chuàng)建一個有封套(envelope)的空白SOAP信息,這個封套還帶有頭(heade)和體(body)。假如你在這個信息中不需要SOAP頭(SOAP header),那么你可以將這個元素從信息中刪除:
  
  SOAPMessage message = factory.createMessage();
  SOAPHeader header = message.getSOAPHeader();
  header.detachNode();
  
  把 XML 結(jié)構(gòu)加入信息也是直接了當(dāng)?shù)?
  
  SOAPBody body = message.getSOAPBody();
  
  Name listingElementName = soapFactory.createName(
    "propertyListing", "realProperty",
    "http://schemas.realhouses.com/listingSubmission";);
  SOAPBodyElement listingElement = body.addBodyElement(listingElementName);
  
  Name 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("add");
  
  SOAPElement propertyAddress = listingElement.addChildElement("propertyAddress");
  SOAPElement street = propertyAddress.addChildElement("street");
  street.addTextNode("1234 Main St");
  SOAPElement city = propertyAddress.addChildElement("city");
  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");
  
  注重,你要把屬性的ID作為一個參數(shù)加入到屬性列表元素(propertyListing)中。 更進(jìn)一步的是,你要用QName, 或namespace來限定propertyListing元素。
  
  你可以用幾種方法把附件加入到SOAP信息中。 在這一個例子中,你首先要創(chuàng)建元素來指示列表屬性的背景圖片和前景圖片。它們每個都有一個href屬性指明附件的內(nèi)容ID:
  
  String frontImageID = "property1234_front_jpeg@realhouses.com";
  SOAPElement frontImRef = listingElement.addChildElement("frontImage");
  Name hrefAttName = soapFactory.createName("href");
  frontImRef.addAttribute(hrefAttName, frontImageID);
  
  String interiorID = "property1234_interior_jpeg@realhouses.com";
  SOAPElement interiorImRef = listingElement.addChildElement("interiorImage");
  interiorImRef.addAttribute(hrefAttName, interiorID);
  
  要方便地把需要的圖像文件附加在信息中,可以使用JavaBeans Activation Framework架構(gòu)里面的javax.activation.DataHandler對象。DataHandler能自動地檢測傳遞給它的數(shù)據(jù)類型,而且它還能自動地分配適當(dāng)?shù)腗IME類型給附件:
  
  URL url = new URL("file&:///eXPort/files/pic1.jpg");
  DataHandler dataHandler = new DataHandler(url);
  AttachmentPart att = message.createAttachmentPart(dataHandler);
  att.setContentId(frontImageID);
  message.addAttachmentPart(att);
  
  另一種方法,你可以把一個對象,連同正確的MIME類型一起,傳遞到createAttachmentPart()方法里。這個方法跟第一個方法類似。在內(nèi)部,SAAJ將會尋找處理器DataContentHandler 來處理這個MIME類型。 假如它不能找一個合適的處理器,createAttachmentPart() 方法將會拋出一個IllegalArgumentException異常:
  
  URL url2 = new URL("file&:///export/files/pic2.jpg");
  Image im = Toolkit.getDefaultToolkit().createImage(url2);
  AttachmentPart att2 = message.createAttachmentPart(im, "image/jpeg");
  att2.setContentId(interiorID);
  message.addAttachmentPart(att2);
  
  這個方法的缺點集中在:它依靠于AWT中示例UI(用戶界面user interface)相關(guān)的類。 在一些粗心的(服務(wù)器)設(shè)置中,這些庫并沒有被正確的設(shè)置。
  不管你選擇什么方法來產(chǎn)生附件,上述的代碼表示了在第一個列表里面的SOAP信息。 既然這只是一個簡

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 介休市| 阿克陶县| 西丰县| 女性| 信丰县| 扎兰屯市| 阿克| 马尔康县| 福安市| 民权县| 白朗县| 晋江市| 扶绥县| 邻水| 大姚县| 临沧市| 双柏县| 凌云县| 肥城市| 岳池县| 桦甸市| 辛集市| 会理县| 南漳县| 四平市| 东安县| 西乌珠穆沁旗| 阳西县| 中西区| 拜泉县| 南平市| 民权县| 潍坊市| 内乡县| 西峡县| 大洼县| 内黄县| 漳浦县| 碌曲县| 德州市| 嘉禾县|