My class looks like:
class Flabben_XmlRpc_Server
{
/**
* add entry to database and return its id
*
* @access public
* @param integer $iUserId
* @param string $sTitle
* @param string $sContent
* @return integer
*/
public function addEntry($iUserId, $sTitle, $sContent)
{
return 1;
}
}
-- Jan
-- Jan Pieper <[EMAIL PROTECTED]> wrote
(on Thursday, 01 March 2007, 07:23 PM +0100):
The result I get ist:
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse><params><param><value><string/></value></param></params></
methodResponse>
Zend_XmlRpc_Client_FaultException caught: Calling parameters do not match
signature
I can´t find my mistake...
Read the docs. :-)
The Zend server classes use the Reflection API to determine the
dispatchable prototypes -- and determines the number and types for the
method parameters and return value. When an incoming request happens, it
checks the calling parameters against the registered prototypes. So, if
the calling parameters do not match, you get that message.
The fix? Make sure that you do your docblocks thoroughly:
/**
* do something with a table
*
* @param string $table
* @param int $id
* @param struct $values (Struct denotes an assoc array)
* @return boolean
*/
public function doSomething($table, $id, $values);
Just make sure you use valid xml-rpc types for the typehints -- struct
for associative arrays, int(eger), bool(ean), float/double, array,
string, base64, date.iso9601 (dates).
Also, you *can* OR the types if more than one type is possible:
/**
* Do something
*
* @param string $table
* @param int|string $id
* @param string|struct $values
* @return boolean
*/
(The above will have 4 valid prototypes.)
-- Werner <[EMAIL PROTECTED]> wrote
(on Thursday, 01 March 2007, 06:42 PM +0200):
I also want to start playing around with it for an upcoming project.
Would you mind posting the skeleton on the list? (to me, the list also
serves as a repository (and archive) of code snippets, etc.
I love searching for keywords and topics in the list with my mail
client, it has proven to be a useful resource to me many times before.
Therefore, I would like to ask you to please put as much example code in
the list as possible, since you are knowledgeable and it provides a
general answer (or starting point) to list-subscribers.
Thank you for your time and effort,
Werner
Matthew Weier O'Phinney wrote:
I have. Contact me off-list, and I'll provide a skeleton for you.
Okay, it's below.
There are some points where you'll need to modify it (require service
classes and attach them to the server, specify path to a cache file,
specify exception classes that may return XML-RPC faults, etc.).
Additionally, you may want to add some logging functionality surrounding
the handle() call -- log the request and response, for instance, or just
log request/response when fault responses occur.
=============================================================
<?php
// Turn of error reporting; mucks with XML responses
ini_set('display_errors', false);
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';
/** Zend_XmlRpc_Server */
require_once 'Zend/XmlRpc/Server.php';
/** Zend_XmlRpc_Server_Cache */
require_once 'Zend/XmlRpc/Server/Cache.php';
/** Zend_XmlRpc_Server_Fault */
require_once 'Zend/XmlRpc/Server/Fault.php';
/**
* Also load your service classes here:
* require_once 'Services/Foo.php'; // etc.
*/
/**
* XMLRPC Controller: dispatch XMLRPC requests
*
* URI route is: /xml-rpc
*
* Any additional URI components will be ignored.
*
* @uses Zend_Controller_Action
* @uses Zend_XmlRpc_Server
*/
class XmlRpcController extends Zend_Controller_Action
{
/**
* Override and/or set this to specify a server cache file
* @var string
*/
public $cacheFile;
/**
* Array of exception classes that can be reported as XML-RPC faults.
* Override or set this value.
* @var array
*/
public $validExceptionClasses = array();
/**
* Sets the cache file to a sane default if not set
*
* @return void
*/
public function init()
{
if (null === $this->cacheFile) {
$this->cacheFile = dirname(__FILE__) . '/../cache/xmlrpc.cache';
}
}
/**
* Index action: dispatch xmlrpc server
*
* @return void
*/
public function indexAction()
{
$this->dispatchXmlrpc();
}
/**
* Forward to indexAction()
*
* @param string $method
* @param array $args
* @return void
*/
public function __call($method, $args)
{
return $this->_forward('index');
}
/**
* Dispatch XMLRPC server
*
* @access public
* @return void
*/
public function dispatchXmlrpc()
{
$server = new Zend_XmlRpc_Server();
// Ortus_Exceptions will be returned as fault responses
foreach ($this->validExceptionClasses as $class) {
Zend_XmlRpc_Server_Fault::attachFaultException($class);
}
if (!Zend_XmlRpc_Server_Cache::get($this->cacheFile, $server)) {
/**
* Attach XML-RPC classes, with optional namespaces. Example:
* $server->setClass('Service_Foo', 'foo');
* $server->setClass('Model_Bar', 'bar');
*/
Zend_XmlRpc_Server_Cache::save($this->cacheFile, $server);
}
// Dispatch request...
$response = $server->handle();
$response->setEncoding('ISO-8859-1');
header('Content-Type: text/xml; charset=ISO-8859-1');
echo $response->saveXml();
}
}
|