设为首页 收藏本站
查看: 652|回复: 0

[经验分享] XML-RPC for PHP简介及使用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-25 10:27:05 | 显示全部楼层 |阅读模式
一.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){
  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/rpcclient.php,可以看见结果。
  
  敢死队2在线观看

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103923-1-1.html 上篇帖子: 关于静态页面的蜘蛛爬行记录,PHP版 下篇帖子: PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 的解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表