作者:Simon Guest
在過(guò)去一段時(shí)間里,很多供應(yīng)商紛紛以驚人的速度發(fā)布其Web服務(wù)的實(shí)現(xiàn)。這包括產(chǎn)品的主要版本、輔助版本和許多開(kāi)發(fā)服務(wù)包。隨著新版本越來(lái)越符合標(biāo)準(zhǔn),不同供應(yīng)商之間的互操作性越來(lái)越高。
盡管如此,仍然需要在共同使用這些Web服務(wù)時(shí)的建議和策略。有些實(shí)踐允許您確保以互操作的方式既使用又公開(kāi)Web服務(wù)?;谝延械慕?jīng)驗(yàn),我整理了關(guān)于Web服務(wù)互操作性的“十大”要點(diǎn)列表。有些要點(diǎn)基于在Microsoft上運(yùn)行的測(cè)試結(jié)果的發(fā)現(xiàn),另外一些是在開(kāi)發(fā)項(xiàng)目時(shí)覺(jué)得有用。這里的提示可以應(yīng)用于IBM、BEA及多個(gè)開(kāi)放源碼堆棧。我希望它們對(duì)您有用。下面從下往上依次介紹這些要點(diǎn):
通過(guò)Web服務(wù)發(fā)送空數(shù)組可能產(chǎn)生問(wèn)題。有些工具包將空數(shù)組識(shí)別為單個(gè)空值,而另外一些則將其表示為一組空數(shù)組元素。我的一般原則是,通過(guò)Web服務(wù)發(fā)送對(duì)象數(shù)組時(shí),始終確保讓數(shù)組包含有效數(shù)據(jù)。
很多基于Java的工具有生成客戶(hù)端代理時(shí)指定獨(dú)特的包和類(lèi)型名稱(chēng)的選項(xiàng)(例如,BEA WebLogic使用“clientgen”參數(shù),IBM Rational Application Developer使用向?qū)В?/p>
為共享同一數(shù)據(jù)類(lèi)型的Web服務(wù)創(chuàng)建代理時(shí),對(duì)包和類(lèi)型名稱(chēng)的控制非常重要,例如在調(diào)用兩個(gè)具有相同Order類(lèi)型的Web服務(wù)時(shí)。
使用工具或IDE從XSD文件生成Java Bean時(shí),始終確保您知道如何執(zhí)行測(cè)試操作以了解對(duì)象是否為空。您可能認(rèn)為下面的代碼可以完成這樣的測(cè)試:
if (myObject == null)
但是在某些情況下,您是在測(cè)試對(duì)象是否存在,而不是對(duì)象的值是否存在。我的建議是,始終在生成的bean上檢查isNil()方法(或類(lèi)似方法)。如果它存在,則可確保得到真值。
在Java中,java.util.Date和java.util.Calendar被分類(lèi)為引用類(lèi)型。在.NET Framework 1.1中,System.DateTime被視為值類(lèi)型。
這將會(huì)如何?引用類(lèi)型可以為空,而值類(lèi)型不能。如果要跨越Web服務(wù)發(fā)送空日期值,則始終以復(fù)雜類(lèi)型發(fā)送值,并將復(fù)雜類(lèi)型的值設(shè)置為空。這將有助于避免空的日期值被曲解(從而引發(fā)異常)。
如果通過(guò)Web服務(wù)在.NET和Java之間發(fā)送日期和時(shí)間,則始終使用Java中適當(dāng)?shù)腸ompareTo()方法來(lái)比較日期。例如使用:
if (myDate.compareTo(yourDate) == 0)
而不要使用:
if (myDate == yourDate)
這將有助于確保平臺(tái)間日期比較的準(zhǔn)確性,尤其是試圖比較毫秒值時(shí)。
“跟蹤工具”是研究SOAP請(qǐng)求和Web服務(wù)間響應(yīng)的理想選擇。它可以幫助驗(yàn)證數(shù)據(jù)類(lèi)型和消息構(gòu)造,還會(huì)報(bào)告您在瀏覽器中可能錯(cuò)過(guò)的SOAP錯(cuò)誤。
可用的跟蹤工具有很多類(lèi)型 —— 有些在客戶(hù)端上運(yùn)行,有些在服務(wù)器上運(yùn)行,有些甚至運(yùn)行于客戶(hù)端和服務(wù)器之間(如代理)。這些類(lèi)型的跟蹤工具設(shè)置起來(lái)比較困難,但是總的來(lái)說(shuō)還是很有用的,因?yàn)槟梢钥吹皆谙到y(tǒng)之間傳遞的消息。有些代理跟蹤工具甚至還可以讓您編輯和回復(fù)消息——這一點(diǎn)對(duì)于調(diào)試非常有用。
設(shè)計(jì)Web服務(wù)客戶(hù)端時(shí),考慮添加一個(gè)幫助器方法用于更改Web服務(wù)位置的主機(jī)和端口值。這會(huì)為將來(lái)Web服務(wù)的位置變更或者把輸出重定向到跟蹤工具帶來(lái)方便。我發(fā)現(xiàn)這在Web服務(wù)間進(jìn)行故障切換時(shí)特別有用。
有些工具包提供一個(gè)選項(xiàng),讓您從以下內(nèi)容中為Web服務(wù)做出選擇:
• | RPC/Encoding |
• | RPC/Literal |
• | Document/Literal |
這些選項(xiàng)為Web服務(wù)契約控制樣式和編碼機(jī)制。要幫助確保與WS-I Basic Profile一致,始終確保將Document/Literal作為您所有Web服務(wù)的默認(rèn)編碼機(jī)制。RPC/Literal僅在特殊情況下使用。永遠(yuǎn)不要使用RPC/Encoding。
單元測(cè)試(使用.NET的NUnit或Java的JUnit)是通過(guò)Web服務(wù)檢查多種數(shù)據(jù)類(lèi)型的互操作性的最好方式。
如果數(shù)據(jù)類(lèi)型變更(或如果更改Web服務(wù)工具包的版本!),則需要再次運(yùn)行測(cè)試。這可以讓您確信您設(shè)計(jì)的Web服務(wù)具有完整的互操作性。
設(shè)計(jì)互操作性時(shí),始終一開(kāi)始先定義數(shù)據(jù)。決定要發(fā)送的數(shù)據(jù)后,首先在XSD中創(chuàng)建數(shù)據(jù)類(lèi)型,然后使用工具從XSD文件生成類(lèi)。依此順序執(zhí)行操作,有助于確保數(shù)據(jù)類(lèi)型的在線互操作性。為此,需要熟悉XSD —— 了解如何在XSD中建模數(shù)據(jù)和可用于建模數(shù)據(jù)的工具。XSD文件可以在Visual Studio .NET中直接創(chuàng)建和編輯。有了XSD后,在每個(gè)平臺(tái)上使用適當(dāng)?shù)墓ぞ呱蓴?shù)據(jù)類(lèi)型。在.NET中,可以使用xsd.exe(框架的一部分)或XsdObjectGen(可從MSDN免費(fèi)下載)。對(duì)于Java,這取決于您所使用的工具包。對(duì)于IBM,使用Java Bean for XML Schema Wizard;對(duì)于BEA,將XSD文件拖到WebLogic Workshop中的Schemas文件夾中。如果是其他工具包,則搜索Schema2Java工具。完成后,在Web服務(wù)中公開(kāi)生成的數(shù)據(jù)類(lèi)型 ——此步驟的前提是,您需要確保這些類(lèi)型能夠被正確地序列化到XSD和XML中。到您可以保證數(shù)據(jù)的在線顯示方式時(shí),互操作性對(duì)您來(lái)說(shuō)就已經(jīng)近在咫尺了!
聯(lián)系客服