新的blog系统要实现发文章时ping的功能,http://www.technorati.com/developers/ping/ 和 http://rpc.weblogs.com/ ,实现Ping功能,要用XML_RPC,转篇文章,学习一下。
XML-RPC仅支持有限的几种数据类型。下面是和PHP数据类型的的对应关系:
我们使用的XML-RPC工具包是Useful, Inc.的Edd Dumbill制作的,下载网址 http://phpxmlrpc.sourceforge.net ,其中完整包括client和server的XML-RPC实现。
客户端和服务器端分别由 xmlrpc_client 类和 xmlrpc_server 类实现,主要用于接收和发送XML-RPC报文。xmlrpcval 类用于将PHP变量编码为XML-RPC等价数据类型和向远程方法传递参数。相反的过程使用 xmlrpc_decode() 函数。XML-RPC报文使用 xmlrpcmsg 类通过传递给它一个参数表来创建。
xmlrpc_client 类发送使用 xmlrpcmsg 类创建的XML-RPC报文,在服务器端, xmlrpc_server 类解析这些收到的报文为 xmlrpcmsg 对象。然后这个对象被作为一个单独参数传递给用户函数。该函数必须返回一个 xmlrpcresp 对象, xmlrpc_server 类将其用于序列化并返回给客户端。这个基本的体系结构如下图所示。
在 http://phpxmlrpc.sourceforge.net 下载,解包,然后将 xmlrpc.inc 和 xmlrpcs.inc 放置到你的包含路径即可。
客户端程序首部只要加入下面的包含语句:
include(’xmlrpc.inc’);
服务器端程序首部要加入下面的包含语句:
include(’xmlrpc.inc’);
include(’xmlrpcs.inc’); //服务器端代码
XML-RPC client: xmlrpc_client.php 执行
//创建client对象, 三个参数依次为 path, hostname, port
$s=new xmlrpc_client(‘/xmlrpc/xmlrpc_server.php’, ‘www.windix.local’, 80);
//create xmlrpcval object, which allows the encoding of our variable
//创建xmlrpcval对象,将我们的PHP变量编码为XML-RPC需要的XML形式
$inputString=new xmlrpcval(‘world’, ’string’);
//create an array of parameters
//尽管我们只有一个参数,但仍然要转换成数组的形式,因为xmlrpcmsg的第二个参数是一个参数表
$parameters=array($inputString);
//create the message object
//创建XML-RPC报文,参数分别为 远程方法名 和 参数表
$msg=new xmlrpcmsg(‘echoString’, $parameters);
//send the message, get the response
//发送报文,返回值$rsp为一个xmlrpcresp对象,它包含以下三个方法:
//faultCode() 出错代码,如果成功将返回0
//faultString() 出错信息
//value() 返回值,以xmlrpcval对象形式存在,PHP使用前需要进行解码
$rsp=$s->send($msg);
//check for errors
if($rsp->faultcode()==0) {
//decode the response to a PHP type
//xmlrpc_decode()函数用于将xmlrpcval对象解码
$response=xmlrpc_decode($rsp->value());
//print results
print ‘
‘;
var_dump($response);
print ‘
‘;
} else {
//print errors
print ‘Error: ‘.$rsp->faultcode().‘, ‘.$rsp->faultstring().‘
‘;
}
//show messages
//然后我们来查看一下报文内容
$msg->createpayload();
print ‘REQUEST:
'</font><font color="#007700">.</font><font color="#0000bb">$msg</font><font color="#007700">-></font><font color="#0000bb">payload</font><font color="#007700">.</font><font color="#dd0000">'
‘;
print ‘RESPONSE:
'</font><font color="#007700">.</font><font color="#0000bb">$rsp</font><font color="#007700">-></font><font color="#0000bb">serialize</font><font color="#007700">().</font><font color="#dd0000">'
‘;
?>
XML-RPC server: xmlrpc_server.php
//xmlrpc_server.php//service that echoes a string
//我们用于处理远程调用的自定义函数
//注意,该函数必须且只能有一个类型为xmlrpcmsg对象的参数
function echoString($msg) {
//decode parameters into navtive types
//首先使用xmlrpc_decode函数进行解码
$inputString=xmlrpc_decode(array_shift($msg->params));
//check for input parameter validity
//检查数据类型是否正确
if(is_string($inputString)) {
return new xmlrpcresp( new xmlrpcval(‘Hello, ‘.$inputString, ’string’) );
} else { //or return a fault
return new xmlrpcresp(0, $xmlrpcerruser+1, “Parameter type “.gettype($inputString).” mismatched expected type.”);
}
}
//instantiate the server object and register our functions
//初始化server对象,并注册我们的函数
//下面这个数组称为”dispatch map”,其中以输出函数名为主键的项又是一个数组
//包含以下三个成员:
// function 实际调用的函数名,在这里我们的函数名也是echoString,同服务名一样
// signature 可选。输入和输出参数的类型,最后一个是输出参数,前面的都是输入参数
// docstring 可选。包含你的服务的文档,甚至可以有HTML内容。
//xmlrpc_server还包含第二个可选初始化参数,如果设置为0,则服务不会立刻处理请求
//需要使用server的service()方法进程才能被执行