【http://hedong.3322.org/archives/000470.html】XML-RPC協議
xml-rpc 是一套規範及其一系列的實現,允許運行在不同作業系統、不同環境的程式基於internet進行遠端程序呼叫。
這種遠端程序呼叫使用http作為傳輸協議,xml作為傳送資訊的編碼格式。Xml-Rpc的定義儘可能的保持了簡單,但同時能夠傳送、處理、返回複雜的資料結構。
Xml-rpc是工作在internet上的遠端程序呼叫協議。一個xml-rpc訊息就是一個請求體為xml的http-post請求,被調用的方法在伺服器端執行並將執行結果以xml格式編碼後返回。
程序呼叫參數可以是標量、數值、字串、日期等,也可以是複雜的記錄或列表結構(list structures,即數群組類型).
XML-RPC請求的例子:
POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181
<?xml version="1.0"?<
<methodCall<
<methodName<examples.getStateName</methodName<
<params<
<param<
<value<<i4<41</i4<</value<
</param<
</params<
</methodCall<
要求標頭部的要求:
- 第
一行中,URI的格式可以不指定。例如,如果服務只處理XML-RPC調用,
它可以為空白,或只是一個斜線。然而,如果伺服器要處理各種HTTP請求,則我們應讓URI能協助將請求路由到處理這個XML-RPC請求的代碼上。
(例子中,URI是/RPC2, 這告訴伺服器將這個請求路由到“RPC2”應答程式上.)
- User-Agent和Host必須指定.
- Content-Type須是text/xml.
- Content-Length必須指定且必須正確.
承載的格式:
- 有效資訊在一個單一的XML結構<methodCall> 中.
- <methodCall>
須含有一個<methodName>子項,這是一個字串,含有要調用的方法(過程)的名字。該字串只能含有字母(大小寫A-Z),
數字(0-9), 底線, 點, 冒號和斜線(/). 伺服器決定如何解釋methodName的字元.
- 例如,methodName 可能是一個指令碼的名字(指令碼在接到某個請求時運行),可能是一個資料庫表中某個記錄的某個欄位,或可能是一個含有目錄和檔案的結構的檔案的路徑名。
- 如
果程序呼叫有參數則 <methodCall> 必須包含一個<params>子項. <params>
可以包含任意數量的 <param>子項, 每個<param>含有一個<value>子項.
純量資料型別(scalar )
參數值<value>可以是標量,用類型標籤將值包括起來。如果沒指定類型,則認為是string類型。類型標籤如下表:
| Tag |
Type |
Example |
| <i4> or <int> |
4位元組帶正負號的整數值 |
-12 |
| <boolean> |
0 (false) or 1 (true) |
1 |
| <string> |
字串 |
hello world |
| <double> |
雙精確度帶符號浮點值 |
-12.214 |
| <dateTime.iso8601> |
日期/時間 |
19980717T14:08:55 |
| <base64> |
base64編碼的位元據 |
eW91IGNhbid0IHJlYWQgdGhpcyE= |
結構資料類型(<struct>)
參數值也可以是<struct>類型一個<struct>可含有幾個<member>項,每
個<member>含有一個<name>項和一個<value>項。<member>
的<value>值可以為任何類型,可為標量類型、<array>甚至<struct>(即可以遞迴).例子:
<struct>
<member>
<name>lowerBound</name>
<value><i4>18</i4></value>
</member>
<member>
<name>upperBound</name>
<value><i4>139</i4></value>
</member>
</struct>
數組資料類型(<array>)
參數值也可以是<array>類型一個<array>含有單一的 <data>
元素,<data>元素可以含有任意數量的<value>,
這裡的<value>沒有name.每個<value>的資料類型可各不相同,如下例所示。
<data>的<value>值可以為任何類型,可為標量類型、 <struct>甚至<array>(即可以遞迴).
<array>
<data>
<value><i4>12</i4></value>
<value><string>Egypt</string></value>
<value><boolean>0</boolean></value>
<value><i4>-31</i4></value>
</data>
</array>
XML-RPC應答的一個例子:
HTTP/1.1 200 OK
Connection: close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:08 GMT
Server: UserLand Frontier/5.1.2-WinNT
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
XML-RPC應答格式:
- 除非有低層錯誤,總是要返回200 OK.
- Content-Type須是 text/xml. Content-Length 必須出現且值準確.
- 應答包體是一個單一XML結構 <methodResponse>, 它可以包含單一的<params>
,<params>含有單一的<param>, <param> 含有單一<value>.
- <methodResponse> 也可以包含一個<fault>,
它含有一個<struct>類型的<value>,這個<struct>中含有兩個元素,一個名
為<faultCode>的<int>值,一個名為 <faultString>的<string>.
- <methodResponse>不能同時包含 <fault> 和<params>.
XML-RPC調用失敗時的應答的例子:
HTTP/1.1 200 OK
Connection: close
Content-Length: 426
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:02 GMT
Server: UserLand Frontier/5.1.2-WinNT
<?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>
策略與目標:
- Firewalls. 這個協議的目標,是在不同的環境之間,鋪設一個相容性的基礎,它沒有超越CGI能力的新功能。防火牆軟體可以監視Content-Type為text/xml的post類型的請求。
- Discoverability. 我們要求它是一個簡單的、 乾淨的可擴充的的格式。它應該可能滿足: 一個HTML編碼器能夠通過讀一個含有XML-RPC的檔案, 明白它在做什麼, 且能修改它以及 在第一次或第二次請求時讓它工作起來.
- Easy to implement. 我們還要求它是一個易於實現的協議,能很快在其它的環境或作業系統上跑起來。
參考資料:
- Dave Winer, XML-RPC Specification, http://www.xmlrpc.com/spec
- Trier, XML-RPC入門, http://www.javaresearch.org/article/showarticle.jsp?column=46&thread=4037
- Userland, XML-RPC Home,
http://www.xmlrpc.com/
Posted by Hilton at February 9, 2004 09:25 PM
| TrackBack
Comments
一般用這個開源包,
http://ws.apache.org/xmlrpc/
Posted by: Hilton at February 18, 2004 05:34 PM