?
一.XML-RPC是什么?
XML-RPC是Userland?Software公司设计的一种格式:是一种使用HTTP协议传输XML格式文件来获取远程程序调用(Remote?Procedure?Call)的传输方式。官方网站是www.xmlrpc.com。
在http://phpxmlrpc.sourceforge.net/上面有个PHP?XML-RPC的框架(类集合)用于使用PHP语言来写XML-RPC客户端和服务端。现在的稳定发行版本是2.2,下载地址是http://sourceforge.net/projects/phpxmlrpc/files/phpxmlrpc/2.2.2/xmlrpc-2.2.2.tar.gz/download。
另外你在www.xmlrpc.com上面也可以找到其他s语言的XML-RPC列表,例如Perl、Python。
这篇文章将介绍XML-RPC?for?PHP的类库使用。
二.系统运行要求
该类库的设计目标是可扩展性和向后兼容性。因此,它支持大部分的现有PHP版本。最低需要的PHP版本是4.2。该类库提供一个兼容层来支持PHP?4.0.5和4.1。当然官方建议是使用PHP?5.0或者更高版本。
注意,如果你要用SSL或者HTTP?1.1跟远程服务器通信,必须把“CURL”扩展编译进PHP中。
另外,PHP自带的原生“xmlrpc”扩展跟这里介绍的XML-RPC类库不是同一个东西,所以并不需要将其编译进PHP中。
三.相关类介绍
1.xmlrpcval
在XML-RPC中有六种基本类型和两种复合类型,基本类型是:int、boolean、string、double、dateTime.iso8601、base6,复合类型是:array、struct。Xmlrpcval的作用就是把PHP中类型转换成这几种类型放入XML-RPC中,以便传输。
new xmlrpcval(123,"int"); //将123作为XML-RPC int类型
new xmlrpcval(123,"string"); //将123作为XML-RPC string类型
new xmlrpcval(123);//如果没有第二个参数,系统默认将其作为string类型
new xmlrpcval( //XML-RPC array类型
array(
new xmlrpcval("string1"),
new xmlrpcval("string2"),
new xmlrpcval("string3"),),"array");
new xmlrpcval( //XML-RPC struct类型
array( "name"=>new xmlrpcval("codebean","string"),
"age"=>new xmlrpcval(34,"int"),
"address"=>new xmlrpcval(
array( "street"=>new xmlrpcva("xiaoyinxilu","string"), "city"=>new xmlrpcval("beijing","string") ),
"struct")),
"struct");
?
相关方法:
kindOf():返回该对象的基本类型:"struct","array","scalar"。
scalarVal():如果$val->kindOf()=="scalar",则直接返回改对象的PHP对应的值。
arrayMen(int?$n):如果$val->kindOf()=="array",返回$val中第n个的值。
arraySize():如果$val->kindOf()=="array",返回$val的元素个数。
2.xmlrpcmsg
这个类提供一个向XML-RPC服务器发送请求的对象,客户端发送xmlrpcmsg到服务器,服务器返回一个xmlrpcresp。
//请求服务器的examples.getStateName方法,参数是123
$message = new xmlrpcmsg("examples.getStateName",array(new xmlrpcval(123,"int")));
?
相关函数:
getNumParams():获取xmlrpcmsg对象的参数的总数。
getParam(int?$n):获取xmlrpcmsg对象的第n个数的值。
3.xmlrpc_client
客户端的基本类。
?
?
//在服务端www.test.com上面的interface.php路径建立相关链接。
$client = nw xmlrpc_client("/interface.php","ww.test.com",80);
?
相关方法:
send($message,30):向服务端发送$message,超时时间是30秒。
setDebug(int?$level):设置是否输出调试信息,默认是0即不输出调试信息。$level是1,打印服务端的HTTP头信息及XML信息。$level是2,同时打印服务端和客户端的HTTP头信息及XML信息。
4.xmlrpcresp
该类主要包含XML-RPC请求返回的结果。Xmlrpc_client的send方法返回该类型。
new xmlrpcresp(xmlrpcval $val);//在服务端生成一个xmlrpcresp对象
new xmlrpcresp(0,int $errcode,string $err_string);//服务端出错时,可以返回该类型。
相关方法:
faultCode():客户端获取服务端返回的出错代码。
faultString():客户端获取服务端返回的出错信息。
Value():客户端获取服务端返回的值。
5.xmlrpc_server
服务端的基本类。
function test($xmlrpcval){
return new xmlrpcresp($val);
}
//客户端可以访问examples.myTest来实际访问test()函数
new xmlrpc_server(
array(
"examples.myTest"=>array("function"=>"test")
));
四,一个实际例子
假设服务度是my.rpcserver.com,提供服务的路径是interface.php,客户端是my.test.com.
在服务度的interface.php中:
<?php
include './lib/xmlrpc.inc';
include './lib/xmlrpcs.inc';
function foo($xmlrpcmsg){
$par1 = $xmlrpcmsg->getParam(0); //获取第一个参数
$val1 = $par1->scalarval(); //转换成PHP对应的值
$par2 = $xmlrpcmsg->getParam(1); //获取第二个参数
$val2 = $par2->scalarval(); //转换成PHP对应的值
$par3 = $xmlrpcmsg->getParam(2); //获取第二个参数
//转换成PHP对应的值
for($i=0; $i<$par3->arraySize(); $i++){
$v = $par3->arrayMem($i);
$val[] = $v->scalarVal()."<br>";
}
$msg1 = new xmlrpcval(strrev($val1),"string");
$msg2 = new xmlrpcval(strrev($val2),"int");
$msg = new xmlrpcval(array($msg1,$msg2),"array"); //返回一个array
return new xmlrpcresp($msg);
}
new xmlrpc_server(
array(
"example.test"=>array("function"=>"foo"),
)
);
?>
?
在客户端的client.php中:
<?php
include './lib/xmlrpc.inc';
$params = array(
new xmlrpcval("hello rpc","string"),
new xmlrpcval(123,"int"),
new xmlrpcval(
array(
new xmlrpcval("test","string"),
new xmlrpcval(456,"int")
),
"array"),
);
$message = new xmlrpcmsg("example.test",$params);
$client = new xmlrpc_client("/interface.php", "my.rpcserver.com" ,'80');
//$client->setDebug(2);
$res = $client->send($message,30);
if(!$res->faultCode()){
$v= $res->value();
for($i=0; $i<$v->arraySize(); $i++){
$vv = $v->arrayMem($i);
echo $vv->scalarVal()."<br>";
}
}else{
echo $res->faultcode().":".$res->faultString()."<br>";
}
?>
?