[转]用PHP写XMLRPC
这几天一直在研究XMLRPC。最初的原因是因为del.icio.us支持每日的“书签自动发布到Blog”功能,而我的533上面有自己写PHP Blog程序,于是就自己联想到是否可以让del.icio.us自动发布到那个上面去。一方面可以保存自己的书签,另外还可以当没有时间写Blog的时候,可以偷懒一下。这样一举两得的时期,我是最愿意做的。del.icio.us主要利用metaWeblog API这个XMLRPC规范来实现Blog自动发布的,所以只有你的Blog程序支持这个接口,实际上只要支持metaWeblog.newPost这个函数就可以了。
XMLRPC-PHP是一个PHP库,它的特点是功能强大,而且不需要PHP的原生XMLRPC支持,只需要PHP的XML库。XMLRPC-PHP对于XMLRPC的各种数据类型进行了封装,并且自动提供如ListMethod、GetMethodSig、GetMethodHelp等函数。
简单的一个PHP函数,计算两个数的总和:
//addFunc的Singature(签名),表明其返回类型是int(第一个参数),和参数类型(后面的参数);
$addFunc_sig=array(array($xmlrpcInt,$xmlrpcInt,$xmlrpcInt));
//addFunc的Doc(说明)
$addFunc_doc='Calucate the sum of Tow Integer,return Integer";
function AddFunc($m){
$a=$m->getParam(0);//注意这里$a是signatue里面的第二个参数
$b=$m->getParam(1);//这里的$b是第三个参数
$a=$a->scalarValue(); //取得他们的具体数值。
$b=$b->scalarValue();
//下面这些返回一个xmlrpcresp对象,对象的内容包括一个int类型的val(变量)
return new xmlrpcresp(new xmrpcval($a+$b,"int"));
}
//下面输出:
$a=array(
"example.addTow"=>array(
"function" => "addFunc",
"signature" => $addFunc_sig,
"docstring" => $addFunc_doc
)
);
//生成xmlrpc_server变量,第一个参数是方法的数组。false代表立刻进行服务。
$s=new xmlrpc_server($a,false);
$s->setDebug(3); //3为调试等级。3可以比较详细的输出错误信息。如果没有错误了,可以用确省的1就可以了,就是没有Debug信息。
$s->service(); //开始服务。
从上面来看,用XMLRPC-PHP库建立XMLRPC程序是非常的快速方便。
下面几个是XMLRPC里面几个其他数据类型的返回和调用其数值:
1、数组变量的查询和返回(摘自XMLRPC-PHP自带的例子demo/server.php)
$bitflipper_sig=array(array($xmlrpcArray, $xmlrpcArray));
$bitflipper_doc='Accepts an array of booleans, and returns them inverted';
function bitflipper($m) {
global $xmlrpcArray;
$v=$m->getParam(0);
$sz=$v->arraysize();
$rv=new xmlrpcval(array(), $xmlrpcArray); //必须用xmlrpc方式来建立数组
for($j=0; $j
$b=$v->arraymem($j); //获取数组里面的Salar
if ($b->scalarval()) { //查看数组元素的值
$rv->addScalar(false, "boolean"); //向返回数组里面添加Salar
} else {
$rv->addScalar(true, "boolean");
}
}
return new xmlrpcresp($rv); //返回数组。
}
2、Struct变量的查询和返回
第一个变量的访问例子:
$v1_easyStruct_sig=array(array($xmlrpcInt, $xmlrpcStruct));
$v1_easyStruct_doc='This handler takes a single parameter, a struct, containing at least three elements named moe, larry and curly, all <i4>s. Your handler must add the three numbers and return the result.'; </i4>
function v1_easyStruct($m) {
$sno=$m->getParam(0);
$moe=$sno->structmem("moe"); //存取Struct里面的数值
$larry=$sno->structmem("larry");
$curly=$sno->structmem("curly");
$num=$moe->scalarval() + $larry->scalarval() + $curly->scalarval();
return new xmlrpcresp(new xmlrpcval($num, "int")); }
第二个返回Struct的例子:
$v1_simpleStructReturn_sig=array(array($xmlrpcStruct, $xmlrpcInt)); $v1_simpleStructReturn_doc='This handler takes one parameter, and returns a struct containing three elements, times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.';
function v1_simpleStructReturn($m) {
$sno=$m->getParam(0);
$v=$sno->scalarval();
return new xmlrpcresp(new xmlrpcval(array(
"times10" => new xmlrpcval($v*10, "int"),
"times100" => new xmlrpcval($v*100, "int"),
"times1000" => new xmlrpcval($v*1000, "int")),
"struct" )); //返回一个Struct.
}
看了这些,如果对于XMLRPC协议比较熟悉,发现XMLRPC-PHP对于XMLRPC的支持是非常的完善的!
最后一点,同其他的远程调用的调试一样,XMLRPC的PHP程序的调试比较的麻烦。幸亏xmlrpc-php的主页上面提供了一个调试XMLRPC的好地方,你可以从这里访问。
http://static.flickr.com/110/307477290_e548b7a55b.jpg?v=0
最主要把"show debug info"显示调到“More”,这样可以非常容易的找到出错原因。
另外一点,如果想测试一个东西,最好从最简单的东西开始,其实无论是HelloWorld还是addTwo都是一个非常好的起点,如果他们成功了,表示你的程序的基础设置是没有问题。如果和我一样,马上就写一个比较复杂的程序来测试一个新事物,如果测试不成功,到底是测试程序本身的错误还是基础设置的错误,就像一头乱麻一样,分不清楚头绪,找不到方向了。当然一个比较好的调试系统,可以非常清楚显示运行过程,就太好了。
明天再写如何让我的PHP Blog程序能够接受Del.icio.us的发布,也写一下如何调用LiveSpace的MetaWeblog接口。
页:
[1]