通過(guò) GET 訪問服務(wù)
在 SOAP 1.2 推出之前,使用 HTTP 訪問基于 SOAP 的 Web 服務(wù)的唯一方法是使用 POST
請(qǐng)求。您將需要?jiǎng)?chuàng)建能創(chuàng)建 POST
請(qǐng)求并使用 SOAP 消息作為請(qǐng)求的內(nèi)容的客戶機(jī)。不過(guò),SOAP 1.2 定義了使用 GET
請(qǐng)求訪問基于 SOA 的 Web 服務(wù)的方法。
GET 與 POST 對(duì)比
繼續(xù)我們的討論之前,務(wù)必了解通過(guò) HTTP 的 GET
和 POST
請(qǐng)求的區(qū)別。盡管很多 Web 程序員所進(jìn)行的處理似乎表明二者之間是可以互換的,但實(shí)際上二者的用途并不相同。GET
中的所有關(guān)于所請(qǐng)求的資源的信息都包含在 URL(通常作為參數(shù)),僅用于等冪請(qǐng)求。這些請(qǐng)求是沒有“副作用”的請(qǐng)求。也就是說(shuō),應(yīng)該能夠數(shù)十次、數(shù)百次、數(shù)千次地調(diào)用這個(gè)請(qǐng)求,但這個(gè)請(qǐng)求不會(huì)更改任何東西。例如,請(qǐng)求 Albuquerque 的當(dāng)前氣溫的 Web 請(qǐng)求就是等冪請(qǐng)求。而將注釋傳入到博客數(shù)據(jù)庫(kù)的 Web 請(qǐng)求則不是。
這是因?yàn)?GET
請(qǐng)求可以添加到用戶的書簽,能在不會(huì)引發(fā)警告的情況下進(jìn)行訪問。還可以對(duì)其進(jìn)行引用,而不會(huì)引發(fā)警告。另一方面,POST
請(qǐng)求將其信息包含在請(qǐng)求的正文中,因此很難進(jìn)行隨機(jī)的重復(fù)。
就 SOAP 而言,這意味著應(yīng)該能夠?qū)H檢索信息而不進(jìn)行更改的 SOAP 請(qǐng)求使用 GET
。對(duì)于進(jìn)行更改的任何操作,仍然都應(yīng)使用 POST
。
訪問服務(wù)
在 Axis2 中,可以生成 GET
請(qǐng)求,服務(wù)器會(huì)將其轉(zhuǎn)換為 SOAP 消息,然后將有效負(fù)載作為結(jié)果返回。例如,請(qǐng)將瀏覽器指向清單 31 中所示的位置。
清單 31. 訪問服務(wù)
http://localhost:8080/axis2/services/CMSService/getNumberOfArticles?category=classifieds
|
如果使用 0.94 版,將看到清單 32 中所示的響應(yīng)。
清單 31. SOAP 有效負(fù)載響應(yīng)
<resp:numberOfArcticles>42</resp:numberOfArcticles>
|
不過(guò),這并不十分準(zhǔn)確。根據(jù) SOAP 1.2 建議規(guī)范,應(yīng)該能夠看到整個(gè) SOAP 響應(yīng)。這在 Axis2 將來(lái)的版本中可能會(huì)發(fā)生更改。
處理附件
簡(jiǎn)單 SOAP 消息的另一個(gè)變體是附件。對(duì)于附件,多年來(lái)人們?cè)缫讯炷茉敚捎诂F(xiàn)在某些擴(kuò)展規(guī)范要求使用附件,因此您必須對(duì)其進(jìn)行處理。
二進(jìn)制數(shù)據(jù)和 XML
盡管 XML 是基于文本的格式,但卻不能忽略實(shí)際上是采用二進(jìn)制進(jìn)行表示的。因?yàn)檫@樣,將會(huì)有需要向 Web 服務(wù)傳遞或從其檢索二進(jìn)制信息的情況。
可以采用兩種方式中的一種來(lái)處理這種情況。第一種選擇是將二進(jìn)制數(shù)據(jù)實(shí)際包含在您的文檔中。這種情況的一個(gè)例子是將 Microsoft Word 文檔另存為 XML 文件時(shí)。如果在該文檔中嵌入了任何圖形,Word 會(huì)將其作為二進(jìn)制數(shù)據(jù)嵌入到 XML 文檔中(采用 Base64 編碼)。第二種選擇是直接引用該數(shù)據(jù),以便處理該文檔的應(yīng)用程序能夠找到此數(shù)據(jù)。一個(gè)極為常見的例子是 Web 瀏覽器以及其處理從 XHTML 文件引用的圖像的方式。XHTML 文本包含一個(gè) img
元素(或者,采用了更為先進(jìn)的技術(shù),則為 object
元素),該元素包含一個(gè) src
屬性,其中有指向?qū)嶋H數(shù)據(jù)的 URL。應(yīng)用程序可以隨后從該位置加載數(shù)據(jù)并相應(yīng)地進(jìn)行使用。
SOAP 文檔也是這樣。假如,如果向基于 SOAP 的服務(wù)提交了一個(gè)圖像,有兩個(gè)選擇。可以將該數(shù)據(jù)嵌入在有效負(fù)載中,或可以想辦法引用該數(shù)據(jù)。曾經(jīng)由于涉及到帶寬的一些問題對(duì)此進(jìn)行過(guò)討論。
XML 二進(jìn)制優(yōu)化打包
XML 已經(jīng)比二進(jìn)制對(duì)應(yīng)項(xiàng)冗長(zhǎng)得多了。正因?yàn)槿绱耍鼘⑹褂酶嗟膸挕D敲矗?dāng)考慮使用向 XML 文本文檔添加二進(jìn)制數(shù)據(jù)時(shí)的首選方法(將其編碼為 Base64)時(shí),會(huì)由于兩個(gè)或更多的因素而導(dǎo)致其尺寸增大,這就帶來(lái)了一個(gè)非常實(shí)際的問題。
事實(shí)上,在過(guò)去的兩三年,曾經(jīng)有很多人強(qiáng)烈地批評(píng)缺乏對(duì)二進(jìn)制數(shù)據(jù)的實(shí)時(shí)支持,幾乎充斥著不滿的聲音,最終 W3C 開始著手處理這個(gè)問題。其工作的成果就是 XML 二進(jìn)制優(yōu)化打包(XML-binary Optimized Packages,XOP)。此協(xié)議提供了在 XML 文檔中可靠地引用外部數(shù)據(jù)的方法。例如,SOAP with Attachments 規(guī)范規(guī)定二進(jìn)制數(shù)據(jù)可以作為多部分 MIME 文檔的的一部分發(fā)送,由 XML 數(shù)據(jù)組成第一部分,而二進(jìn)制數(shù)據(jù)作為附加部分添加到其中。這樣做的問題在于,盡管您的程序可能知道數(shù)據(jù)存在,但文檔并不知道這一點(diǎn)。同時(shí),還不允許對(duì)文檔進(jìn)行選擇性優(yōu)化或?qū)ΠM(jìn)制數(shù)據(jù)的現(xiàn)有文檔進(jìn)行回溯處理。
XOP 通過(guò)提供一個(gè)特殊的機(jī)制來(lái)改進(jìn)這種情況,利用這種機(jī)制可選擇性地提取要優(yōu)化的信息,將其添加到多部分 MIME 消息中(其中也包括您的 SOAP 消息)并顯式地對(duì)其進(jìn)行引用。讓我們看一個(gè)例子。
例如,假定員工不想將新文章作為文本元素添加,而希望將其作為二進(jìn)制文檔從字處理程序添加。如果將該內(nèi)容包含在消息體中,將十分混亂,如清單 33 中所示:_
清單 33. 添加二進(jìn)制文檔
<?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 規(guī)定對(duì)數(shù)據(jù)進(jìn)行提取,然后使用一個(gè)引用其新位置的 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--
|
請(qǐng)注意,Include
元素中指定的位置與 Content-ID
減去協(xié)議 cid:
的值匹配。現(xiàn)在要發(fā)送的是此消息,而不是純文本 SOAP 消息。
SOAP、二進(jìn)制數(shù)據(jù)和 Axis2
在 SOAP 文檔中使用 XOP 的過(guò)程稱為 MTOM(即 SOAP 消息傳輸優(yōu)化機(jī)制——Message Transmission Optimization Mechanism)。Axis2 提供了使用 SOA 數(shù)據(jù)的這個(gè)方法的支持,但必須確保對(duì)應(yīng)用程序進(jìn)行了恰當(dāng)配置。
具體來(lái)說(shuō),您必須在 axis2.war 文件內(nèi)的 axis2.xml 文件中啟用此支持(請(qǐng)參見清單 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 文件,進(jìn)行此更改,然后將其重新壓縮成 .war 文件。
要替換 Axis2 應(yīng)用程序,請(qǐng)使用清單 36 中所示的 URL 訪問 Geronimo 控制臺(tái)。
清單 36. Geronimo 控制臺(tái)
http://localhost:8080/console
|
作為 system/manager 登錄,并單擊 Application>Web App WARs,然后卸載并重新安裝 Axis2 應(yīng)用程序。(請(qǐng)記住,執(zhí)行此步驟后,必須重新加載 Web 服務(wù)。)
以編程方式使用 MTOM 不在本教程的討論范圍之內(nèi),但可以在參考資料部分獲取有關(guān)此主題的更多信息。只是要注意,在 Axis2 的 0.95 版之前的版本上可能不會(huì)按照預(yù)期工作,因?yàn)樵摪姹局邪?SOAP with Attachments API for Java (SAAJ) 實(shí)現(xiàn)。
結(jié)束語(yǔ)
在系統(tǒng)間的互操作性非常重要的當(dāng)今世界,可將 Web 服務(wù)視為面向服務(wù)的體系結(jié)構(gòu)的基礎(chǔ)。而 SOAP 則是企業(yè)級(jí) Web 服務(wù)的基礎(chǔ)。本教程介紹了 Web 服務(wù)的基礎(chǔ)知識(shí),并對(duì)了解和在自己的應(yīng)用程序中使用 SOAP 所必需的概念和編程知識(shí)進(jìn)行了說(shuō)明。在本教程中,您了解了以下內(nèi)容:
- 有關(guān) Web 服務(wù)的重要概念
- 如何安裝和使用 Geronimo 應(yīng)用服務(wù)器
- 如何安裝和使用 Axis2 Web 服務(wù)應(yīng)用程序
- 如何創(chuàng)建客戶機(jī)來(lái)訪問 SOAP 服務(wù)
- 如何創(chuàng)建 SOAP 服務(wù)
- 有關(guān) SOAP 服務(wù)的其他問題,如
GET
請(qǐng)求和附件
在本系列的第 2 將討論 Web 服務(wù)描述語(yǔ)言,您將從中學(xué)習(xí)如何使用 WSDL 來(lái)實(shí)現(xiàn)在本文中執(zhí)行的很多步驟的自動(dòng)化,并提供更便于其他人訪問您構(gòu)建的服務(wù)的方法。
下載
描述 |
名字 |
大小 |
下載方法 |
Source code |
ws-understand-web-services1.zip |
12KB |
HTTP
|
|
|
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
- 從此處下載 Apache Geronimo。
- 從此處下載 Apache Axis2。本教程使用的是 0.94 版,但應(yīng)該也能使用更高版本。
- 從此處下載 J2SE SDK。
關(guān)于作者
|
|
|
Nicholas Chase 曾參與多家公司的網(wǎng)站開發(fā)工作,如 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。Nick 擔(dān)任過(guò)高中物理教師、低輻射廢料處理設(shè)施管理員、在線科幻小說(shuō)雜志編輯、多媒體工程師、Oracle 講師以及一家交互通信公司的首席技術(shù)官。他已經(jīng)出版了多本圖書,其中包括 XML Primer Plus (Sams)。
|
posted on 2006-12-29 18:49
SIMONE 閱讀(565)
評(píng)論(0) 編輯 收藏