XML-RPC 是一种跨平台的远程调用协议,适合在Internet上传输。客户端通过HTTP协议向服务器发送一个POST请求,POST数据用XML编码;服务器收到请求后,提取POST数据,获取调用方法和参数,然后执行,最后返回XML格式的结果。
采用XML-RPC协议,不同的服务器之间可以相互通信,调用远程过程。相比SOAP,XML-RPC要简单,更适合web开发。
一个简单的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>
即使从未接触也很容易明白:examples.getStateName是远程调用方法,41则是调用参数,服务器位置是betty.userland.com/RPC2
发送头要求:
1、POST后面的路径不是必须的,如果服务器只处理XML-RPC请求,此处可以省略;如果服务器还要处理HTTP请求,应将服务器的路径补全。
2、User-Agent和Host必须指明。
3、Content-Type必须是text/xml格式。
4、发送的字节数必须指明,而且必须正确。
5、其他头信息根据需要可以添加。
用PHP很容易实现
$fp = fopen ( $host , $port , $error , $errstr , 10 );
if ( $error )
die ( $errstr );
fwrite ( $fp , " POST / HTTP1.1 " );
fwrite ( $fp , " User-Agent: XML-RPC Client " );
fwrite ( $fp , " Host: $host " );
fwrite ( $fp , " Content-Type: text/xml " );
fwrite ( $fp , " Content-Length: " . strlen ( $xml ) . " " );
while ( $data = fread ( $fp , 1024 )) {
// do something here
}
fclose ( $fp );
XML请求只有一个根元素<methodCall>,紧接着根元素是调用方法名<methodName>,指明要调用的远程过程,最后是参数列表。参数列表以<params>开始,其下每个参数用<param>包括。参数必须指明数值类型,如未指明,默认是string类型。可支持的简单类型有int(或者i4)、boolean、string、base64、double、dateTime.iso8601,复杂数据类型支持数组array和结构struct类型,如果要传输对象类型的数据,必须先将对象转换为struct类型,即将对象的属性导出为struct。
struct类型:
< member >
< name > lowerBound </ name >
< value >< i4 > 18 </ i4 ></ value >
</ member >
< member >
< name > upperBound </ name >
< value >< i4 > 139 </ i4 ></ value >
</ member >
</ struct >
< data >
< value >< i4 > 12 </ i4 ></ value >
< value >< string > Egypt </ string ></ value >
< value >< boolean > 0 </ boolean ></ value >
< value >< i4 > -31 </ i4 ></ value >
</ data >
</ array >
< member >
< name > lowerBound </ name >
< value >< i4 > 18 </ i4 ></ value >
</ member >
< member >
< name > upperBound </ name >
< value >< i4 > 139 </ i4 ></ value >
</ member >
< member >
< name > array </ name >
< 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 >
</ value >
</ member >
</ struct >