XML-RPC 简介及在PHP中的使用

最近需要用到XML-RPC,看到一篇博文,介绍得很详细,想留着以后用,于是就转载了,希望对大家有帮助。

一.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。

二.安装xmlrpc扩展 

如果你的系统中没有安装xmlrpc的php扩展,那么请正确安装。

在Windows平台下,首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:/Windows或者C:/Winnt目录下,(PHP4的扩展在C:/php/extensions目录中,PHP5的扩展在C:/php/ext目录中),同时在C:/Windows/php.ini或者C:/Winnt/php.ini中把extension=php_xmlrpc.dll前面的分号";"去掉,然后重启Web服务器后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。
在Unix/Linux平台下,如果没有安装xmlrpc扩展,请在重新编译PHP,在configure的时候请加入 --with-xmlrpc 选项,然后查看phpinfo()看是否正常安装xmlrpc。
(注意:以下操作都是建立在xmlrpc扩张正常安装前提下,请务必正确安装。)

三.XML-RPC工作原理

XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC 服务器端用来出来从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要的数据。
XML-RPC的服务器端必须有现成的函数提供给客户端调用,并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。下面介绍XML-RPC相关类及函数。

四.XML-RPC相关类介绍

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","www.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){
  returnnew 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
    
    returnnew 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>";
}
?>

接下来访问http://my.test.com/client.php,可以看见运行结果。

转自博友:http://www.cnblogs.com/codebean/

 

 

posted @ 2013-12-09 18:39  爱笑的羊  阅读(2337)  评论(0)    收藏  举报