XML-RPC for PHP简介及使用

一.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类型

newxmlrpcval(123,"string");//将123作为XML-RPCstring类型


newxmlrpcval(123);//如果没有第二个参数,系统默认将其作为string类型



newxmlrpcval(//XML-RPCarray类型


array(


newxmlrpcval("string1"),


newxmlrpcval("string2"),


newxmlrpcval("string3"),),"array");



newxmlrpcval(//XML-RPCstruct类型


array("name"=>newxmlrpcval("codebean","string"),


"age"=>newxmlrpcval(34,"int"),


"address"=>newxmlrpcval(


array("street"=>newxmlrpcva("xiaoyinxilu","string"),"city"=>newxmlrpcval("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){

returnnewxmlrpcresp($val);


}



//客户端可以访问examples.myTest来实际访问test()函数


newxmlrpc_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';



functionfoo($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=newxmlrpcval(strrev($val1),"string");


$msg2=newxmlrpcval(strrev($val2),"int");



$msg=newxmlrpcval(array($msg1,$msg2),"array");//返回一个array



returnnewxmlrpcresp($msg);


}



newxmlrpc_server(


array(


"example.test"=>array("function"=>"foo"),


)


);

?>

 

在客户端的client.php中:

<?php 

include'./lib/xmlrpc.inc';


$params=array(


newxmlrpcval("hellorpc","string"),


newxmlrpcval(123,"int"),


newxmlrpcval(


array(


newxmlrpcval("test","string"),


newxmlrpcval(456,"int")


),


"array"),


);



$message=newxmlrpcmsg("example.test",$params);


$client=newxmlrpc_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>";


}

?>

 

相关推荐