posts - 495,comments - 227,trackbacks - 0

          通過 GET 訪問服務

          在 SOAP 1.2 推出之前,使用 HTTP 訪問基于 SOAP 的 Web 服務的唯一方法是使用 POST 請求。您將需要創建能創建 POST 請求并使用 SOAP 消息作為請求的內容的客戶機。不過,SOAP 1.2 定義了使用 GET 請求訪問基于 SOA 的 Web 服務的方法。

          GET 與 POST 對比

          繼續我們的討論之前,務必了解通過 HTTP 的 GETPOST 請求的區別。盡管很多 Web 程序員所進行的處理似乎表明二者之間是可以互換的,但實際上二者的用途并不相同。GET 中的所有關于所請求的資源的信息都包含在 URL(通常作為參數),僅用于等冪請求。這些請求是沒有“副作用”的請求。也就是說,應該能夠數十次、數百次、數千次地調用這個請求,但這個請求不會更改任何東西。例如,請求 Albuquerque 的當前氣溫的 Web 請求就是等冪請求。而將注釋傳入到博客數據庫的 Web 請求則不是。

          這是因為 GET 請求可以添加到用戶的書簽,能在不會引發警告的情況下進行訪問。還可以對其進行引用,而不會引發警告。另一方面,POST 請求將其信息包含在請求的正文中,因此很難進行隨機的重復。

          就 SOAP 而言,這意味著應該能夠對僅檢索信息而不進行更改的 SOAP 請求使用 GET。對于進行更改的任何操作,仍然都應使用 POST。





          回頁首


          訪問服務

          在 Axis2 中,可以生成 GET 請求,服務器會將其轉換為 SOAP 消息,然后將有效負載作為結果返回。例如,請將瀏覽器指向清單 31 中所示的位置。


          清單 31. 訪問服務
                              
          http://localhost:8080/axis2/services/CMSService/getNumberOfArticles?category=classifieds
          

          如果使用 0.94 版,將看到清單 32 中所示的響應。


          清單 31. SOAP 有效負載響應
                              
          <resp:numberOfArcticles>42</resp:numberOfArcticles>
          

          不過,這并不十分準確。根據 SOAP 1.2 建議規范,應該能夠看到整個 SOAP 響應。這在 Axis2 將來的版本中可能會發生更改。





          回頁首

          處理附件

          簡單 SOAP 消息的另一個變體是附件。對于附件,多年來人們早已耳熟能詳,但由于現在某些擴展規范要求使用附件,因此您必須對其進行處理。

          二進制數據和 XML

          盡管 XML 是基于文本的格式,但卻不能忽略實際上是采用二進制進行表示的。因為這樣,將會有需要向 Web 服務傳遞或從其檢索二進制信息的情況。

          可以采用兩種方式中的一種來處理這種情況。第一種選擇是將二進制數據實際包含在您的文檔中。這種情況的一個例子是將 Microsoft Word 文檔另存為 XML 文件時。如果在該文檔中嵌入了任何圖形,Word 會將其作為二進制數據嵌入到 XML 文檔中(采用 Base64 編碼)。第二種選擇是直接引用該數據,以便處理該文檔的應用程序能夠找到此數據。一個極為常見的例子是 Web 瀏覽器以及其處理從 XHTML 文件引用的圖像的方式。XHTML 文本包含一個 img 元素(或者,采用了更為先進的技術,則為 object 元素),該元素包含一個 src 屬性,其中有指向實際數據的 URL。應用程序可以隨后從該位置加載數據并相應地進行使用。

          SOAP 文檔也是這樣。假如,如果向基于 SOAP 的服務提交了一個圖像,有兩個選擇。可以將該數據嵌入在有效負載中,或可以想辦法引用該數據。曾經由于涉及到帶寬的一些問題對此進行過討論。





          回頁首


          XML 二進制優化打包

          XML 已經比二進制對應項冗長得多了。正因為如此,它將使用更多的帶寬。那么,當考慮使用向 XML 文本文檔添加二進制數據時的首選方法(將其編碼為 Base64)時,會由于兩個或更多的因素而導致其尺寸增大,這就帶來了一個非常實際的問題。

          事實上,在過去的兩三年,曾經有很多人強烈地批評缺乏對二進制數據的實時支持,幾乎充斥著不滿的聲音,最終 W3C 開始著手處理這個問題。其工作的成果就是 XML 二進制優化打包(XML-binary Optimized Packages,XOP)。此協議提供了在 XML 文檔中可靠地引用外部數據的方法。例如,SOAP with Attachments 規范規定二進制數據可以作為多部分 MIME 文檔的的一部分發送,由 XML 數據組成第一部分,而二進制數據作為附加部分添加到其中。這樣做的問題在于,盡管您的程序可能知道數據存在,但文檔并不知道這一點。同時,還不允許對文檔進行選擇性優化或對包含二進制數據的現有文檔進行回溯處理。

          XOP 通過提供一個特殊的機制來改進這種情況,利用這種機制可選擇性地提取要優化的信息,將其添加到多部分 MIME 消息中(其中也包括您的 SOAP 消息)并顯式地對其進行引用。讓我們看一個例子。

          例如,假定員工不想將新文章作為文本元素添加,而希望將其作為二進制文檔從字處理程序添加。如果將該內容包含在消息體中,將十分混亂,如清單 33 中所示:_


          清單 33. 添加二進制文檔
                              
          <?xml version='1.0' ?>
          <env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"> 
           <env:Header>
           </env:Header>
           <env:Body>
            <cms:addArticle xmlns:cms="http://www.daily-moon.com/cms">
              <cms:category>classifieds</category>
              <cms:subcategory>forsale
          </cms:subcategory>
              <cms:articleHeadline><cms:articleHeadline>
              <cms:articleText>wvetwenptiubnweoirntuwopeirt4m[456n09ew7nv
          sa0tv043u6y304o5mu60ew9rebtm45bm4-69nw-0er9utnv3094nb-26204
          95u6-49kv6-m34956h-wb09emjb-0n67u-340v,=qw-enr7w8b64b03278-
          ANDLOTSMOREBASE64ENCODEDDATAHERE</cms:articleText>
            </cms:addArticle>
           </env:Body>
          </env:Envelope>
          

          相反,XOP 規定對數據進行提取,然后使用一個引用其新位置的 Include 元素將其替換,如清單 34 中所示。


          清單 34. 使用 XOP
                              
          MIME-Version: 1.0
          Content-Type: Multipart/Related;boundary=MIME_boundary;
              type="application/xop+xml";
              start="<soapmsg.xml@daily-moon.com>";
              start-info="text/xml"
          Content-Description: An XML document with binary data in it
          
          --MIME_boundary
          Content-Type: application/xop+xml; 
              charset=UTF-8; 
              type="text/xml"
          Content-Transfer-Encoding: 8bit
          Content-ID: <soapmsg.xml@daily-moon.com>
          
          <env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"> 
           <env:Header>
           </env:Header>
           <env:Body>
            <cms:addArticle xmlns:cms="http://www.daily-moon.com/cms">
              <cms:category>classifieds</category>
              <cms:subcategory>forsale
          </cms:subcategory>
              <cms:articleHeadline><cms:articleHeadline>
              <cms:articleText><xop:Include 
            xmlns:xop='http://www.w3.org/2004/08/xop/include' 
            href='cid:http://daily-moon.com/tbird.doc'
          /></cms:articleText>
            </cms:addArticle>
           </env:Body>
          </env:Envelope>
          
          --MIME_boundary
          Content-Type: application/vnd.oasis.openoffice
          Content-Transfer-Encoding: binary
          Content-ID: <http://daily-moon.com/tbird.doc>
          
          // binary octets for the word processing file
          
          --MIME_boundary--
          

          請注意,Include 元素中指定的位置與 Content-ID 減去協議 cid: 的值匹配?,F在要發送的是此消息,而不是純文本 SOAP 消息。





          回頁首


          SOAP、二進制數據和 Axis2

          在 SOAP 文檔中使用 XOP 的過程稱為 MTOM(即 SOAP 消息傳輸優化機制——Message Transmission Optimization Mechanism)。Axis2 提供了使用 SOA 數據的這個方法的支持,但必須確保對應用程序進行了恰當配置。

          具體來說,您必須在 axis2.war 文件內的 axis2.xml 文件中啟用此支持(請參見清單 35)。


          清單 35. 將 XOP 與 Axis2 一起使用
                              
          <axisconfig name="AxisJava2.0">
              <!-- ================================================= -->
              <!-- Parameters -->
              <!-- ================================================= -->
              <parameter name="hotdeployment" locked="false">true</parameter>
              <parameter name="hotupdate" locked="false">true</parameter>
              <parameter name="enableMTOM" locked="false">true</parameter>
           
              <!-- Uncomment this to enable REST support -->
              <!--    <parameter name="enableREST" locked="false">true</parameter>-->
          
              <parameter name="userName" locked="false">admin</parameter>
              <parameter name="password" locked="false">axis2</parameter>
          ...
          

          如果有必要,可以提取 axis2.war 文件,進行此更改,然后將其重新壓縮成 .war 文件。

          要替換 Axis2 應用程序,請使用清單 36 中所示的 URL 訪問 Geronimo 控制臺。


          清單 36. Geronimo 控制臺
                              
          http://localhost:8080/console
          

          作為 system/manager 登錄,并單擊 Application>Web App WARs,然后卸載并重新安裝 Axis2 應用程序。(請記住,執行此步驟后,必須重新加載 Web 服務。)

          以編程方式使用 MTOM 不在本教程的討論范圍之內,但可以在參考資料部分獲取有關此主題的更多信息。只是要注意,在 Axis2 的 0.95 版之前的版本上可能不會按照預期工作,因為該版本中包含了 SOAP with Attachments API for Java (SAAJ) 實現。





          回頁首

          結束語

          在系統間的互操作性非常重要的當今世界,可將 Web 服務視為面向服務的體系結構的基礎。而 SOAP 則是企業級 Web 服務的基礎。本教程介紹了 Web 服務的基礎知識,并對了解和在自己的應用程序中使用 SOAP 所必需的概念和編程知識進行了說明。在本教程中,您了解了以下內容:

          • 有關 Web 服務的重要概念
          • 如何安裝和使用 Geronimo 應用服務器
          • 如何安裝和使用 Axis2 Web 服務應用程序
          • 如何創建客戶機來訪問 SOAP 服務
          • 如何創建 SOAP 服務
          • 有關 SOAP 服務的其他問題,如 GET 請求和附件

          在本系列的第 2 將討論 Web 服務描述語言,您將從中學習如何使用 WSDL 來實現在本文中執行的很多步驟的自動化,并提供更便于其他人訪問您構建的服務的方法。





          回頁首

          下載

          描述 名字 大小 下載方法
          Source code ws-understand-web-services1.zip 12KB HTTP
          關于下載方法的信息 Get Adobe? Reader?

          參考資料

          學習

          獲得產品和技術
          • 此處下載 Apache Geronimo。

          • 此處下載 Apache Axis2。本教程使用的是 0.94 版,但應該也能使用更高版本。

          • 此處下載 J2SE SDK。




          回頁首

          關于作者

          Nicholas Chase 曾參與多家公司的網站開發工作,如 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。Nick 擔任過高中物理教師、低輻射廢料處理設施管理員、在線科幻小說雜志編輯、多媒體工程師、Oracle 講師以及一家交互通信公司的首席技術官。他已經出版了多本圖書,其中包括 XML Primer Plus (Sams)。


          posted on 2006-12-29 18:49 SIMONE 閱讀(574) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 城口县| 呼伦贝尔市| 重庆市| 浠水县| 永顺县| 进贤县| 孝昌县| 石柱| 台东市| 利津县| 丘北县| 双江| 剑阁县| 西充县| 甘肃省| 明星| 永胜县| 中山市| 黑河市| 兴海县| 梅州市| 四平市| 嘉定区| 东阿县| 伽师县| 湖南省| 抚松县| 新龙县| 中阳县| 北流市| 綦江县| 凌海市| 新河县| 栾川县| 石河子市| 贵溪市| 清镇市| 洱源县| 新龙县| 日喀则市| 中西区|