原来我曾经说过,Zend_XmlRpc不好象不能传参数。今天又研究了下,看来原来打了个小马虎。
我现在以实现MetaWeblog API的例子,说明一下。跟官方文档实现上是差不多的。
首先,要实现一个Xmlrpc的服务端。非常简单,因为ZendFramework已经帮你把它作好了。
public function indexAction()
{
$server = new Zend_XmlRpc_Server();
$server->setClass('MetaWeblogCore', 'metaWeblog');
echo $server->handle();
}
很明显第一行是创建一个Xmlrpc的服务实例。然后通过setClass()方法设置可调用的方法类和名字空间,当然,你可以使用addFunction这个方法,这样可调用的方法直接就可以写在控制中了。
注意$server->handle()返回的是Zend_XmlRpc_Response,而不是最终输出的对象。
现在来看看MetaWeblogCore这个类,这是一个MetaWeblog API的实现。查看规范(中文版)
/**
* The MetaWeblog API newPost
*
* @param string $blogid
* @param string $username
* @param string $password
* @param struct $struct
* @param boolean $publish
* @return string
*/
public function newPost($blogid, $username, $password, $struct, $publish)
原来我没有上面的注释,以为这只是PHPDoc里面的东西,就没有写。原来这几行是必须要的。。。
最后,再建立一个client来测试
public function indexAction()
{
$client = new Zend_XmlRpc_Client('http://localhost/xmlrpc');
$blogid = '30';
$username = 'username ';
$password = 'password ';
$struct = array(
'title' => 'me',
'description' => 'money'
);
$publish = true;
$result = $client->call('metaWeblog.newPost', array($blogid, $username, $password, $struct, $publish));
$this->getResponse()->setHeader('Content-Type', 'text/xml', true);
$this->getResponse()->setBody($result);
}
setHeader()和setBody()用于设置返回值。虽然现在看上去还不向一个API都基本方法就是这样。
这里主要说明的那个小马虎。。。。