xmlrpc是一个基于Internet的远程过程调用协议。它主要通过消息(Message)调用工作,基于HTTP-POST,Message的Body部分是XML格式,同样当结果返回的时候也是XML格式。过程的参数可以是基本变量(Scalar),还可以是一个结构(struct)或者是一个数组(array)。
一个调用实例:
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>
调用头部说明
User-Agent和Host是必须的。
Content-Type是text/xml.
Content-Length必须提供,而且必须是正确的!
Body部分说明:
首先可以看到是一个XML格式的文本。主体部分是一个methodCall元素,包含着方法名称(MethodName)及其调用参数(params)。
<param>的<value>部分,XMLPRC支持的类型有下列几种:
1、变量(Scalar)<value>类型:
<value>里面可以包含的类型有;
类型 说明 实例
<i4>或者<int> 整数 -12
<boolean> 0(false),1(true)
<string> 字符串 hello world
<double> 浮点数 -12.123
<dateTime.iso8601> 时间 19980717T14:08:55
<base64> base64编码 eW91IGNhbid0IHJlYWQgdGhpcyE=
缺省类型是string.
2、<struct>s
<struct>类型包含若干个<member>,每一个<member>包含<name>和<value>.
实例:
<struct>
<member>
<name>lowerBound</name>
<value><i4>18</i4></value>
</member>
<member>
<name>upperBound</name>
<value><i4>139</i4></value>
</member>
</struct>
3、<array>s
<array>包含若干个<data>,每一个<data>可以包含若干个<value>。
实例:
<array>
<data>
<value><i4>12</i4></value>
<value><string>Egypt</string></value>
<value><boolean>0</boolean></value>
<value><i4>-31</i4></value>
</data>
</array>
XMLRPC的基本类型就是上面这些。
一个响应的例子:
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>
例子说明:
1、如果调用成功:
返回必须是200 OK;
Content-Type是text/xml.
Content-Length也是必须的,而且必须是正确的!
主体部分是一个methodResponse元素,包含着返回参数(params)及其类型。
2、如果调用不成功
主体部分是一个methodResponse元素,包含着一个<fault>及其原因<value>,原因是一个<struct>,里面包含错误号(faultCode)和错误原因(faultString)。
譬如:
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>
3、params和fault不能同时存在。