XML-RPC

XML-RPC是一個遠程過程調用（Remote Procedure Call，RPC）的分布式計算協議，通過XML將調用函數封裝，並使用HTTP協議作為傳送機制。

## 歷史

XML-RPC發表於1998年，由UserLand Software（UserLand Software）的Dave Winer及Microsoft共同發表。後來在新的功能不斷被引入下，這個標準慢慢演變成為今日的SOAP協定。

XML-RPC協定是已登記的專利項目，由Phillip Merrick、Stewart Allen及Joseph Lapp共同持有，於1998年3月提出申請，指其將用於一個構想中的應用程式，並於2006年4月獲得接納。現時這個專利由位於美國維珍尼亞州費爾法克斯的webMethods使用。

## 用法

XML-RPC調用過程是由客戶端通過向實現XML-RPC的伺服器發送HTTP請求並接收響應實現。一次調用包含多個參數和一個結果。協議為參數和結果定義了若干數據類型。這些數據類型可以包含嵌套的，例如可以構建由五個整數組成的陣列作為參數。

參數-結果結構和不同數據類型旨反映常見程式語言中使用的結構和數據類型。

可以使用流行的 HTTP 安全方法實現客戶端的授權識別。基本認證可用於識別和身份驗證。

JSON-RPC跟 XML-RPC 相類似。

## 數據類型

以下的例子為日常的數據類型在轉化為等同的XML後的面貌：

名稱｜標記範例｜描述

array｜由值構成的陣列，不存儲鍵

```xml
<array>
  <data>
    <value><i4>1404</i4></value>
    <value><string>Something here</string></value>
    <value><i4>1</i4></value>
  </data>
</array>
```

base64｜`<base64>eW91IGNhbid0IHJlYWQgdGhpcyE=</base64>`｜以Base64編碼的二進位數據

boolean｜`<boolean>1</boolean>`｜布爾型邏輯值 (0 或 1)

date/time｜`<dateTime.iso8601>19980717T14:08:55</dateTime.iso8601>`｜以ISO 8601格式存儲的日期和時間

double｜`<double>-12.53</double>`｜雙倍精確浮點數

integer｜`<i4>42</i4>` or `<int>42</int>`｜整數

string｜`<string>Hello world!</string>`｜字串，必須遵守XML encoding（XML encoding）的格式。

struct｜結構體

```xml
<struct>
  <member>
    <name>foo</name>
    <value><i4>1</i4></value>
  </member>
  <member>
    <name>bar</name>
    <value><i4>2</i4></value>
  </member>
</struct>
```

nil｜`<nil/>`

## 範例

以下為一個尋常的 XML-RPC 請求的範例：

```xml
<?xml version="1.0"?>
<methodCall>
  <methodName>examples.getStateName</methodName>
  <params>
    <param>
        <value><i4>40</i4></value>
    </param>
  </params>
</methodCall>
```

相對於上述請求，以下為一個尋常回應的範例：

```xml
<?xml version="1.0"?>
<methodResponse>
  <params>
    <param>
        <value><string>South Dakota</string></value>
    </param>
  </params>
</methodResponse>
```

以下為一個尋常的 XML-RPC 錯誤：

```xml
<?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>
```

## 實現

### Python

- xmlrpclib
- Renamed xmlrpc.client in Python 3.
- Creating XML-RPC Servers and Clients with Twisted

### C++

- Libiqxmlrpc
- Ultra lightweight XML-RPC library for C++
- XML-RPC for C and C++
- XmlRpc++
- XmlRpc C++ client for Windows
- gSOAP toolkit for C and C++ supporting XML-RPC and more
- libmaia: XML-RPC for Qt/C++

### Objective-C / GNUstep / Cocoa

- XMLRPC Framework
- Cocoa XML-RPC Framework : Open Source XML-RPC framework written for use in Mac OS X Cocoa applications.

### Erlang

- XML-RPC for Erlang: This is an HTTP 1.1 compliant XML-RPC library for Erlang. It is designed to make it easy to write XML-RPC Erlang clients and/or servers. The library is compliant with the XML-RPC specification published by https://web.archive.org/web/20051210031514/http://www.xmlrpc.org/

### Java

- Apache XML-RPC : Open source library for Java
- XML-RPC Delight : Convenient serialisation/deserialisation for Apache XML-RPC using Java Annotations and Beans
- Secure Apache XML-RPC
- Redstone XML-RPC Library : Redstone's Open Source Library - XML-RPC implementation in Java
- XML-RPC Library for Java ME : Open source client-side library for Java ME

### XMPP

- pyJabberXMLRPC : Python classes for XMPP
- Jabber-RPC : Over the Extensible Messaging and Presence Protocol protocol

### Other

- JSON/XML-RPC Client and Server : Abstract away the differences between JSON-RPC and XML-RPC
- RemObjects SDK Delphi and .NET package for XML-RPC, in addition to SOAP and others
- RealThinClient SDK : For Delphi/C++
- XML::RPC : Perl module implementation
- XML-RPC for ActionScript : For Flash ActionScript 2.0
- as3-rpclib : For Flex/Actionscript 3
- XML-RPC.NET: Open source library for .NET clients and servers
- XmlRpc-Light : Client and server library for OCaml
- S-XML-RPC : Client and server library for Common Lisp
- PHP-XML-RPC : For PHP
- HaXR: Client and server library for Haskell
- xi library with PHP and Javascript XML-RPC: For PHP and Javascript
- Ruby XML-RPC library: For Ruby
- XML-RPC interface to Lua: For Lua
- android-xmlrpc : A light XML-RPC client for Google Android
- XML-RPC for Tcl : A Tcl implementation of XML-RPC providing client and server support
- : RebXR, a full client/server XML-RPC implementation for REBOL.

## 參看

- AJAX
- Component technologies
- List of Web service markup languages
- OPML
- Web服務