XML - 管理資料交換/RPC
| 上一章 | 下一章 |
| ← WDDX | JSTL → |
作者:Nathan Slider
編輯:Nathan Slider
UGA 網際網路技術碩士課程, 2005
完成本章後,您將能夠
- 討論 XML-RPC
- 根據示例建立 XML-RPC 程式碼
為了完全理解 XML-RPC,我們應該首先定義 RPC。遠端過程呼叫 (RPC) 是一種協議,允許一臺主機上執行的計算機程式在無需程式設計師顯式編碼的情況下,在另一臺主機上執行程式碼。RPC 由呼叫者(客戶端)向遠端系統(伺服器)傳送請求訊息來啟動,該請求訊息使用提供的引數來執行某個過程。結果訊息將返回給呼叫者。各種實現中存在許多變體和細微差別,導致各種不同的(不相容的)RPC 協議。
為了允許伺服器被不同的客戶端訪問,已經建立了許多標準化的 RPC 系統。其中大多數使用介面描述語言 (IDL) 來允許各種平臺呼叫 RPC。Web 服務是跨平臺實現 RPC 的首次真正嘗試。使用 Web 服務,.NET 客戶端可以呼叫在 Unix 伺服器上用 Java 實現的遠端過程(反之亦然)。
Web 服務使用 XML 作為 IDL,並使用 HTTP 作為網路協議。此係統的優點是簡單性和標準化,IDL 是一個廣泛理解的文字檔案,而 HTTP 內建在幾乎所有現代作業系統中。XML-RPC 就是這種 RPC 系統的一個例子。
XML-RPC (可擴充套件標記語言遠端過程呼叫) 是一種用 XML 編碼的遠端過程呼叫協議。這是一個非常簡單的協議,只定義了少量的資料型別和命令,整個描述可以在兩頁紙上打印出來。這與大多數 RPC 系統形成鮮明對比,在大多數 RPC 系統中,標準文件通常有數千頁,需要大量的軟體支援才能使用。
它最初由 Dave Winer 於 1995 年與 微軟 共同建立。但是,微軟認為它過於簡單,開始新增功能。經過幾輪這種操作後,該標準不再那麼簡單,變成了現在的 SOAP。
"我們想要一個簡潔、可擴充套件的格式,非常簡單。HTML 編碼人員應該能夠檢視包含 XML-RPC 過程呼叫的檔案,理解其作用,並能夠修改它,並使其在一兩次嘗試中就能執行... 我們還想讓它成為一個易於實現的協議,可以快速適應在其他環境或其他作業系統上執行。"-xmlrpc.com
引用自 XML-RPC 的資料型別
| 名稱 | 標籤示例 | 描述 |
|---|---|---|
| 陣列 |
<array>
<data>
<value><i4>1404</i4></value>
<value><string>Something Here</string></value>
<value><i4>1</i4></value>
</data>
</array>
|
值陣列,不儲存鍵 |
| base64 | <base64>eW91IGNhbid0IHJlYWQgdGhpcyE=</base64> | [Base 64] 編碼的二進位制資料 |
| 布林值 | <boolean>1</boolean> | [布林值] 邏輯值(0 或 1) |
| 日期/時間 | <dateTime.iso8601>19980717T14:08:55</dateTime.iso8601> | 日期和時間 |
| 雙精度 | <double>-12.53</double> | 雙精度 [精度] 浮點數 |
| 整數 | <i4>42</i4> | 整數,[整數] |
| 字串 | <string>Hello world!</string> | 字元的字串。必須遵循 XML 編碼。 |
| 結構 |
<struct>
<member>
<name>foo</name>
<value><i4>1</i4></value>
</member>
<member>
<name>bar</name>
<value><i4>2</i4></value>
</member>
</struct>
|
值陣列,儲存鍵 |
| 空 | <nil/> | 判別空值;一個 XML-RPC 擴充套件 |
典型的 XML-RPC 請求示例如下所示
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
典型的 XML-RPC 響應示例如下所示
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
典型的 XML-RPC 錯誤示例如下所示
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Too many parameters.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
最後一個示例,將 PHP 關聯陣列與等效的 XML-RPC <struct> 進行比較。此陣列
Array
(
[0] => 'dogs',
[1] => 'cats',
['animals'] => Array(
[0] => FALSE,
[1] => 'little_dogs',
[2] => 'little_cats',
[3] => 5,
[4] => 2.3,
[5] => 1,
),
);
變為以下 XML-RPC
<?xml version="1.0" encoding="utf-8"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>0
</name>
<value><string>dogs</string>
</value>
</member>
<member>
<name>1
</name>
<value><string>cats</string>
</value>
</member>
<member>
<name>animals
</name>
<value>
<array>
<data>
<value><boolean>0</boolean>
</value>
<value><string>little_dogs</string>
</value>
<value><string>little_cats</string>
</value>
<value><i4>5</i4>
</value>
<value><double>2.3</double>
</value>
<value><boolean>1</boolean>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>