- 學習 XML-RPC
- XML-RPC - 首頁
- XML-RPC - 簡介
- XML-RPC - 資料模型
- XML-RPC - 請求
- XML-RPC - 響應
- XML-RPC - 錯誤
- XML-RPC - 示例
- XML-RPC - 總結
- XML-RPC 資源
- XML-RPC - 快速指南
- XML-RPC - 有用資源
XML-RPC - 快速指南
XML-RPC - 簡介
RPC 代表遠端過程呼叫。顧名思義,它是一種呼叫遠端計算機上可用過程或函式的機制。RPC 是一種比 Web 更古老的技術。實際上,RPC 為開發人員提供了一種定義可在網路上呼叫的介面的機制。這些介面可以像單個函式呼叫一樣簡單,也可以像大型 API 一樣複雜。
什麼是 XML-RPC?
XML-RPC 是最簡單和最可靠的 Web 服務方法之一,它使計算機能夠輕鬆地呼叫其他計算機上的過程。
XML-RPC 允許程式跨網路進行函式或過程呼叫。
XML-RPC 使用 HTTP 協議將資訊從客戶端計算機傳遞到伺服器計算機。
XML-RPC 使用一小部分 XML 詞彙來描述請求和響應的性質。
XML-RPC 客戶端在 XML 請求中指定過程名稱和引數,伺服器在 XML 響應中返回錯誤或響應。
XML-RPC 引數是型別和內容的簡單列表 - 結構體和陣列是可用的最複雜型別。
XML-RPC 沒有物件的概念,也沒有包含使用其他 XML 詞彙的資訊的機制。
但是,使用 XML-RPC 和 Web 服務,Web 成為過程連線的集合,計算機沿著緊密繫結的路徑交換資訊。
XML-RPC 誕生於 1998 年初;它由 UserLand Software 釋出,並最初在其 Frontier 產品中實現。
為什麼要使用 XML-RPC?
如果您需要整合多個計算環境,但不需要直接共享複雜的資料結構,您會發現 XML-RPC 使您能夠快速輕鬆地建立通訊。
即使您在一個環境中工作,您也可能會發現 RPC 方法使連線具有不同資料模型或處理期望的程式變得容易,並且它可以提供對可重用邏輯的輕鬆訪問。
XML-RPC 是建立各種計算機之間連線的絕佳工具。
XML-RPC 為整合人員提供了一個使用標準詞彙和方法交換資訊的機會。
XML-RPC 最明顯的應用領域是連線不同型別的環境,允許 Java 與 Perl、Python、ASP 等進行通訊。
XML-RPC 技術概述
XML-RPC 由三個相對較小的部分組成
XML-RPC 資料模型:用於傳遞引數、返回值和錯誤(錯誤訊息)的一組型別。
XML-RPC 請求結構:包含方法和引數資訊的 HTTP POST 請求。
XML-RPC 響應結構:包含返回值或錯誤資訊的 HTTP 響應。
我們將在接下來的三章中學習所有這三個元件。
XML-RPC - 資料模型
XML-RPC 規範定義了六種基本資料型別和兩種複合資料型別,這些複合資料型別表示型別的組合。
XML-RPC 中的基本資料型別
| 型別 | 值 | 示例 |
|---|---|---|
| int 或 i4 | -2,147,483,648 到 2,147,483,647 之間的 32 位整數。 |
<int>27</int> <i4>27</i4> |
| double | 64 位浮點數 |
<double>27.31415</double> <double>-1.1465</double> |
| Boolean | true (1) 或 false (0) |
<boolean>1</boolean> <boolean>0</boolean> |
| string | ASCII 文字,儘管許多實現支援 Unicode |
<string>Hello</string> <string>bonkers! @</string> |
| dateTime.iso8601 | ISO8601 格式的日期:CCYYMMDDTHH:MM:SS |
<dateTime.iso8601> 20021125T02:20:04 </dateTime.iso8601> <dateTime.iso8601> 20020104T17:27:30 </dateTime.iso8601> |
| base64 | 根據 RFC 2045 定義的 Base 64 編碼的二進位制資訊 |
<base64>SGVsbG8sIFdvcmxkIQ==</base64> |
這些基本型別始終包含在value元素中。字串(並且只有字串)可以包含在value元素中,但省略string元素。這些基本型別可以組合成兩種更復雜的型別,陣列和結構體。陣列表示順序資訊,而結構體表示名稱-值對,類似於雜湊表、關聯陣列或屬性。
陣列由array元素指示,該元素包含一個data元素,其中包含值的列表。與其他資料型別一樣,array元素必須包含在value元素中。例如,以下array包含四個字串
<value>
<array>
<data>
<value><string>This </string></value>
<value><string>is </string></value>
<value><string>an </string></value>
<value><string>array.</string></value>
</data>
</array>
</value>
以下陣列包含四個整數
<value>
<array>
<data>
<value><int>7</int></value>
<value><int>1247</int></value>
<value><int>-91</int></value>
<value><int>42</int></value>
</data>
</array>
</value>
陣列還可以包含不同型別的混合,如下所示
<value>
<array>
<data>
<value><boolean>1</boolean></value>
<value><string>Chaotic collection, eh?</string></value>
<value><int>-91</int></value>
<value><double>42.14159265</double></value>
</data>
</array>
</value>
建立多維陣列很簡單 - 只需在陣列中新增一個數組即可
<value>
<array>
<data>
<value>
<array>
<data>
<value><int>10</int></value>
<value><int>20</int></value>
<value><int>30</int></value>
</data>
</array>
</value>
<value>
<array>
<data>
<value><int>15</int></value>
<value><int>25</int></value>
<value><int>35</int></value>
</data>
</array>
</value>
</data>
</array>
</value>
一個簡單的結構體可能如下所示
<value>
<struct>
<member>
<name>givenName</name>
<value><string>Joseph</string></value>
</member>
<member>
<name>familyName</name>
<value><string>DiNardo</string></value>
</member>
<member>
<name>age</name>
<value><int>27</int></value>
</member>
</struct>
</value>
這樣您就可以實現幾乎所有程式語言支援的資料型別。
XML-RPC - 請求格式
XML-RPC 請求是 XML 內容和 HTTP 標頭的組合。XML 內容使用資料型別結構傳遞引數幷包含識別正在呼叫的過程的其他資訊,而 HTTP 標頭提供用於透過 Web 傳遞請求的包裝器。
每個請求都包含一個 XML 文件,其根元素是methodCall元素。每個methodCall元素都包含一個methodName元素和一個params元素。methodName元素標識要呼叫的過程的名稱,而params元素包含引數及其值的列表。每個params元素都包含一個param元素列表,而param元素又包含value元素。
例如,要將請求傳遞給名為circleArea的方法,該方法採用Double引數(表示半徑),則 XML-RPC 請求將如下所示
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
這些請求的 HTTP 標頭將反映傳送方和內容。基本模板如下所示
POST /target HTTP 1.0 User-Agent: Identifier Host: host.making.request Content-Type: text/xml Content-Length: length of request in bytes
例如,如果circleArea方法可從偵聽於/xmlrpc的 XML-RPC 伺服器獲得,則請求可能如下所示
POST /xmlrpc HTTP 1.0 User-Agent: myXMLRPCClient/1.0 Host: 192.168.124.2 Content-Type: text/xml Content-Length: 169
組合在一起,整個請求將如下所示
POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
這是一個普通的 HTTP 請求,帶有精心構造的有效負載。
XML-RPC - 響應格式
響應與請求非常相似,但有一些額外的變化。如果響應成功 - 找到過程、正確執行並返回結果 - 那麼 XML-RPC 響應將與請求非常相似,除了methodCall元素被methodResponse元素替換,並且沒有methodName元素
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
XML-RPC 響應只能包含一個引數。
該引數可以是陣列或結構體,因此可以返回多個值。
始終需要在響應中返回值。“成功值” - 也許是設定為 true (1) 的布林值。
與請求一樣,響應打包在 HTTP 中並具有 HTTP 標頭。所有 XML-RPC 響應都使用 200 OK 響應程式碼,即使訊息中包含錯誤也是如此。標頭使用與請求類似的通用結構,並且典型的一組標頭可能如下所示
HTTP/1.1 200 OK Date: Sat, 06 Oct 2001 23:20:04 GMT Server: Apache.1.3.12 (Unix) Connection: close Content-Type: text/xml Content-Length: 124
XML-RPC 只需要 HTTP 1.0 支援,但 HTTP 1.1 相容。
Content-Type 必須設定為 text/xml。
Content-Length 標頭指定響應的長度(以位元組為單位)。
完整的響應,包括標頭和響應有效負載,將如下所示
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
從 XML-RPC 伺服器傳遞到 XML-RPC 客戶端後,連線將關閉。後續請求需要作為單獨的 XML-RPC 連線傳送。
XML-RPC - 錯誤格式
XML-RPC 錯誤是一種響應型別。如果處理 XML-RPC 請求時出現問題,則methodResponse元素將包含fault元素而不是params元素。fault元素與params元素一樣,只有一個值表示出現問題。錯誤響應可能如下所示
<?xml version="1.0"?>
<methodResponse>
<fault>
<value><string>No such method!</string></value>
</fault>
</methodResponse>
錯誤也將具有錯誤程式碼。XML-RPC 根本不標準化錯誤程式碼。您需要檢查特定軟體包的文件以瞭解它們如何處理錯誤。
錯誤響應也可以如下所示
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>code</name>
<value><int>26</int></value>
</member>
<member>
<name>message</name>
<value><string>No such method!</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
XML-RPC - 示例
為了演示 XML-RPC,我們將建立一個使用 Java 處理 XML-RPC 訊息的伺服器,並將建立一個 Java 客戶端來呼叫該伺服器上的過程。
對話的 Java 端使用 Apache XML 專案的 Apache XML-RPC,可從http://xml.apache.org/xmlrpc/獲取
將所有 .jar 檔案放在適當的路徑中,讓我們使用 JAVA 建立一個客戶端和一個小型 XML-RPC 伺服器。
XML-RPC 客戶端
讓我們編寫一個 XML-RPC 客戶端來呼叫名為sum函式的函式。此函式接受兩個引數並返回它們的和。
import java.util.*;
import org.apache.xmlrpc.*;
public class JavaClient
{
public static void main (String [] args)
{
try {
XmlRpcClient client = new XmlRpcClient("https:///RPC2");
Vector params = new Vector();
params.addElement(new Integer(17));
params.addElement(new Integer(13));
Object result = server.execute("sample.sum", params);
int sum = ((Integer) result).intValue();
System.out.println("The sum is: "+ sum);
} catch (Exception exception) {
System.err.println("JavaClient: " + exception);
}
}
}
讓我們看看上面示例客戶端中發生了什麼。
Java 包 org.apache.xmlrpc 包含 XML-RPC Java 客戶端和 XML-RPC 伺服器的類,例如 XmlRpcClient。
java.util 包對於 Vector 類是必需的。
函式server.execute(...)將請求傳送到伺服器。過程 sum(17,13) 在伺服器上被呼叫,就像它是本地過程一樣。過程呼叫的返回值始終是 Object。
這裡“sample”表示在伺服器中定義的處理程式。
請注意,過程呼叫的所有引數始終都收集在 Vector 中。
XmlRpcClient 類是透過指定伺服器機器的“網路地址”後跟 /RPC2 來構造的。
localhost - 表示本地機器
您可以指定 IP 號碼而不是 localhost,例如 194.80.215.219
您可以指定域名,例如 xyz.dyndns.org
您可以指定埠號以及域名,例如 xyz.dyndns.org:8080。預設埠為 80
請注意,遠端過程呼叫的結果始終是 Object,並且必須將其強制轉換為適當的型別。
當出現問題(無連線等)時,會丟擲異常,並且必須使用catch語句捕獲它。
由於上述呼叫,客戶端向伺服器傳送以下訊息。請注意,這是由server.execute(...)在內部處理的,您無需處理它。
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodCall>
<methodName>sample.sum</methodName>
<params>
<param>
<value><int>17</int></value>
</param>
<param>
<value><int>13</int></value>
</param>
</params>
</methodCall>
XML-RPC 伺服器
以下是使用 Java 編寫的 XML-RPC 伺服器的原始碼。它利用了org.apache.xmlrpc.*中可用的內建類。
import org.apache.xmlrpc.*;
public class JavaServer
{
public Integer sum(int x, int y)
{
return new Integer(x+y);
}
public static void main (String [] args)
{
try {
System.out.println("Attempting to start XML-RPC Server...");
WebServer server = new WebServer(80);
server.addHandler("sample", new JavaServer());
server.start();
System.out.println("Started successfully.");
System.out.println("Accepting requests. (Halt program to stop.)");
} catch (Exception exception)
{
System.err.println("JavaServer: " + exception);
}
}
}
讓我們看看我們在上面示例伺服器中做了什麼。
org.apache.xmlrpc 包包含用於 XML-RPC 伺服器實現的 WebServer 類。
遠端呼叫的過程sum在類中的公共方法中實現。
然後將同一伺服器類的例項與客戶端可訪問的處理程式關聯。
伺服器由埠號(此處為:80)初始化。
當出現問題時,會丟擲異常,並且必須使用catch語句捕獲它。
對於給定示例客戶端中提到的呼叫,伺服器將以下響應傳送回客戶端
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value><int>30</int></value>
</param>
</params>
</methodResponse>
現在您的伺服器已準備就緒,因此請在提示符下編譯並執行它,如下所示
C:\ora\xmlrpc\java>java JavaServer Attempting to start XML-RPC Server... Started successfully. Accepting requests. (Halt program to stop.)
現在要測試功能,請如下呼叫此伺服器
C:\ora\xmlrpc\java>java JavaClient 30
XML-RPC - 總結
在本教程中,您學習了什麼是 XML-RPC 以及為什麼要使用 XML-RPC。我們討論了它的資料模型,以及客戶端和伺服器之間交換的請求和響應訊息格式。我們提供了一個示例來演示 XML-RPC 客戶端和伺服器如何交換資訊。
XML-RPC是一個非常簡單的概念,功能有限。從許多方面來說,這些限制是XML-RPC最吸引人的特性,因為它們大大降低了實現該協議和測試其互操作性的難度。
雖然XML-RPC很簡單,但巧妙地運用簡單的工具可以建立複雜而強大的架構。在需要各種不同系統進行通訊的情況下,XML-RPC可能是最合適的最低公分母。
下一步是什麼?
下一步是學習WSDL和SOAP。
WSDL
WSDL是一種基於XML的語言,用於描述Web服務以及如何訪問它們。
WSDL描述了一個Web服務,以及Web服務的報文格式和協議細節。
如果您想了解更多關於WSDL的資訊,請參閱我們的WSDL教程。
SOAP
SOAP是一個簡單的基於XML的協議,允許應用程式透過HTTP交換資訊。
如果您想了解更多關於SOAP的資訊,請參閱我們的SOAP教程。