原先的XML-RPC協議是由Web先鋒Dave Winer於1998年在UserLand Software公司發明的。其第一個實現是在UserLand FrontIEr開發平台上(事實上,UserLand Software的商標就是"XML-RPC")。“在HTTP之上傳輸XML文本”方法的自然用途就是創建SOAP,這其中有Winer, Don Box以及其他微軟公司人士的貢獻。但是,SOAP由於很多對應用完全不必要得特性而變得非常重量級,所以XML-RPC還是值得注意的。
原先的XML-RPC只使用一些數據類型,並不需要名字空間。通過定義和包含其它值的類型,它獲得了相當可觀的靈活性。下面是一個XML-RPC說明書中的例子。它指定了示例應用程序中"getStateName"方法的輸入參數。
<?XML version="1.0"?>
<methodCall>
<methodName>examples.getStateName
<params>
<param>41
</params>
</methodCall>
你可能已經猜到這個標簽表示4字節整數,下面是用於在標簽中指定如何翻譯內容的所有類型標簽。如果沒有使用任何標簽,就認為是String值。注意,參數並沒有被命名,元素的順序只和方法參數的順序一樣。
Java Type XML tag Description
Integer or A 32 bit signed integer
Double A double precision (64bit) signed floating point number
Boolean 0 (false) or 1 (true)
String string
Date or A timestamp in the ISO8601 style but simplifIEd
Calendar with resolution to the second.
byte[] A base-64 encoded array of bytes
Map Pair(s) of tags where the name is a string and
the value can be any other type, including
Object[] An array of objects where the elements can be any other type.
在原始的說明書中,沒有辦法指明任何類型的“null”值,但擴展版本允許附加類型。
響應也是簡單的XML文件,擁有根元素,或者有或者沒有子元素。這與復雜的SOAP相應對比鮮明。
XML-RPC實現
xmlrpc.com上列出的實現給出了通往79個不同實現的鏈接,它們在各種語言中實現了基本的XML-RPC協議,包括5個2003年12月用Java語言實現的。但是,這些項目中很多都是停滯的。而由Apache Web Services Project主持的項目則是活躍的。我嘗試運行當前的3.0a1版本,卻發現它對其它Web服務項目庫有奇怪的依賴。看起來似乎apache Web Services Project在開發3版本,所以如果你對開源XML-RPC解決方案感興趣,不妨對它多關注。
JAX-RPC: 針對XML RPC的Java API
最早的Java API要從JSR 101開始算起。這項工作從2001年初開始,到2002年年中到達1.0版本。2003年,發布了1.1版本並附帶在Java Web Services Developer Pack由Sun的參考實現。在JAX-RPC中,Java原始類型的定義與XML schema類型緊密相關。它還支持更多的Java標准庫對象,例如,BigInteger 和 BigDecimal,以及符合JavaBeans標准的對象。使用JSR 101的人可以並行開發SOAP和其它XML技術。
Java Web Services Developer Pack (JWSDP)1.6版包括很多其它東西以及對JAX-RPC 1.1.3的一個實現。
JAX-WS 2.0:下一個JAX-RPC
該說明書的下一個版本叫做JAX-WS 2.0,是針對基於XML的Web服務,用來代替JAX-RPC的Java API。該標准被作為Java Specification Request (JSR) 224來開發,現在處於最後草案階段。
JAX-RPC的下一個版本將顯著降低Web服務開發的復雜性,部分通過使用Java 1.5標准庫的特性來實現。你可以跟蹤網站上源碼列表中的參考實現。至於本文,已經可以訪問第3版的參考實現。
使用JWSDP 1.6
JWSDP 1.6一個有用的功能就是對Web Services Description Language (WSDL)的支持。假定有一個描述Web服務的WSDL文檔,那麼就可以自動生成訪問服務的客戶端代碼和支持服務的服務器端代碼。為了用一個簡單的接口用來相應客戶對已發布的Web服務的請求,我在JWSDP 1.6中用wscompile工具創建客戶端的類,它們可以基於三四個輸入參數來描述可能的動作。結果,幾秒鐘內就能創建驚人的32個類。
一旦我指出這些類中的哪些提供真正的創建請求的起始點,那麼編寫代碼實現簡單的命令行接口就很簡單了。而當我想運行程序時,問題隨之而來。客戶端需要從JWSDP中添加10個jar包到他自己的Java程序中。
由於不能幫大家一個一個調試這些jar包與其它Java程序的潛在沖突,我放棄這種做法,轉而用string模板寫一個簡單的程序來創建SOAP請求和XPath來翻譯返回的結果。就像其名字一樣,我認為JWSDP將主要用於創建Web服務,而不是消費Web服務。
XML-RPC還有用嗎?
JAX-RPC的復雜性導致程序員的某種倒退。從Google中搜索"JAX-RPC complexity"就能看到一些用戶的反應。我想你應該在以下情況考慮XML-RPC而不是JAX-RPC:
你的應用程序只需相對簡單的請求
你能控制服務器端和客戶端,你不需要發布WSDL
你想簡單的解析客戶端(就像AJax應用程序)