用Zend_xmlrpc构建webservice服务器

===========================
Calling parameters do not match signature 报错请看红色部分
@param array $value (注意:这是server端中函数的一个形参,必须要在这里体现,传过来是数组,是array,如果是字符串,则是string)
============================================
版权声明:本文为博主原创文章,未经博主允许不得转载。
如下:server端
<?php
require_once 'Zend/XmlRpc/Server.php';
/**
* 返回 MD5 值
*
* @param array $value (注意:这是server端中函数的一个形参,必须要在这里体现,传过来是数组,是array,如果是字符串,则是string)
* @return array MD5
*/
function md5Value($value)
{
return json_encode($value);
}
$server = new Zend_XmlRpc_Server();
$server->addFunction('md5Value');//这里是用addFunction附加一个函数
echo $server->handle();//返回一个对象
?>
client端 (进行XMLRPC调用)
include('Zend/Loader.php');
Zend_Loader::registerAutoload();
$client = new Zend_XmlRpc_Client('http://127.0.0.1/test/server/index.php');
$data=array( //说明:如果传过去的参数是数组,则必须如下要包三层,一个三维数组.
array(
array(
"a"=>"1234",
"b"=>"5678"
)
)
);
$result=$client->call('md5Value',$data);
print_r($result);
结果(json数据):
[{"a":"1234","b":"5678"}]
希望大家有更好的主意,可以一起分享
==================================
【重点】,协议的解析
因为我用到的odoo 的 xmlrpc ,只用用的是火狐的 poster调试的
我记录了。协议发过来的日志,然后写函数,出现了错误
<?xml version='1.0'?>
<methodCall>
<methodName>login</methodName>
<params>
<param>
<value><string>admin</string></value>
</param>
<param>
<value><string>admin</string></value>
</param>
</params>
</methodCall>
注意这个函数发过来的参数是2个字符串,而不是 一个数组,所以对应的函数是
/**
* Echo back a string
* @param string $u 注意要必须要写,zendxmlrpc 会对比参数类型的,如果没有写,就当成了struct 数据类型的
* @param string $p
* @return null
*/
function login($u, $p){
}
而不是
/**
* Echo back a string
* @param array $p 注意要必须要写,zendxmlrpc 会对比参数类型的,如果没有写,就当成了struct 数据类型的
* @return null
*/
function login($p){
}