-- Jan Pieper <[EMAIL PROTECTED]> wrote
(on Wednesday, 07 March 2007, 12:27 AM +0100):
> The problem is, that $tmpParams always contains "void" entries and so my
> sent
> request cannot be handled because no signature matchs.
>
> I hope you´ll test my attached code so you´ll see whats my fault. I am
> searching a few days for the error, tested it in many completly different
> test-applications but it only works with standalone functions and that
> is not
> that what I want to use.
I just tried on my machine, and it worked fine... after I changed the
display_errors setting to off in both scripts.
In particular, you'll want display_errors off in the server script as
any notices or warnings that get emitted by your code will mess with the
XML it returns.
> > -- Jan Pieper <[EMAIL PROTECTED]> wrote
> > (on Thursday, 01 March 2007, 11:16 PM +0100):
> >
> > > To not post so "much" code inside this mail I added some attachments.
> > >
> > > Attachments:
> > > - xmlrpc_server.php
> > > - xmlrpc_client.php
> > > - result.txt
> > >
> > > The server gets the correct request (xml) but I don´t know why this
> > > request cannot be handled.
> > >
> > > (btw.: what is i4?)
> > >
> >
> > Shorthand for integer -- it's a synonym in XML-RPC syntax.
> >
> > Try the following client code and let me know what you get:
> >
> > $connection = new Zend_XmlRpc_Client($URL);
> > $client = $connection-> getProxy();
> > $result = $client-> flabben-> addEntry($uid, $title, $content);
> > var_dump($result);
> >
> > I'm curious to see if there's a subtle issue going on with parameter
> > ordering in the client.
> >
> >
> >
> > > > -- Jan Pieper <[EMAIL PROTECTED]> wrote
> > > > (on Thursday, 01 March 2007, 09:22 PM +0100):
> > > >
> > > >
> > > > > 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;
> > > > > }
> > > > > }
> > > > >
> > > > >
> > > > That looks good -- what is the data being sent to it that's causing the
> > > > error? I'm wondering if one or more items were not the right type?
> > > > Zend_XmlRpc_Server uses Zend_XmlRpc_Value to 'guess' the type; it's
> > > > possible that there's an issue in there. Give as much detail as you can,
> > > > and I'll try and track it down.
> > > >
> > > >
> > > >
> > > >
> > > > > -- 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();
> > > > > }
> > > > > }
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> >
> >
> > > ----- REQUEST
> > > ------------------------------------------------------------------
> > >
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <methodCall> <methodName> flabben.addEntry</methodName> <params> <param>
> > > <value> <int> 1</int> </value> </param> <param> <value> <string>
> > > Test</string> </value> </param> <param> <value> <string> Huhu</string>
> > > </value> </param> </params> </methodCall>
> > >
> > > ----- RESPONSE
> > > -----------------------------------------------------------------
> > >
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <methodResponse> <params> <param> <value> <string/> </value> </param>
> > > </params> </methodResponse>
--
Matthew Weier O'Phinney
PHP Developer | [EMAIL PROTECTED]
Zend - The PHP Company | http://www.zend.com/