-- Jan Pieper <[EMAIL PROTECTED]> wrote
(on Wednesday, 07 March 2007, 08:28 AM +0100):
> My attached files works fine on your maschine? OS? PHP-Version? I am
> using Windows XP and PHP5.2.0, I actually have no unix based maschine
> with a php version greater than 5.1.0 to test it on a unix system.
Linux running PHP 5.2.1.
> I turned display_errors and error_reporting off (*) but if I am using a
> namespace for my methods I´ll always get "Calling parameters do not
> match signature" (Exception thrown in Zend_XmlRpc_Server:511 because
> $sigCalled !== $tmpParams) and this is because all parameters method
> (not request!) are identifed as "void". It seems that the reflection
> can´t parse the doc-comment. If I change all to a standalone function it
> works fine.
Actually, I ran the code you provided, which only ran against the
standalone function. I tried it just now against the class, and it
worked fine. However, that said, I did find a subtle bug: More than one
space between the '@param' and the typehint ('int' in this case) caused
the server to fail. That's easily fixed however, and I'll put an issue
in the tracker for it.
> *) I also tested it by using a normal fsockopen() connection and there
> never was any notices.
>
> /***********************************************************/
>
> WON´T WORK:
>
> class test
> {
> /**
> * @access public
> * @param int $iValueA
> * @param int $iValueB
> * @return int
> */
> public function test($iValueA, $iValueB) {
> return $iValueA * $iValueB;
> }
> }
>
> $oXmlRpcServer->setClass('test', 'mytest'); // call: mytest.test
>
> /***********************************************************/
>
> WORKS FINE:
>
> /**
> * @access public
> * @param int $iValueA
> * @param int $iValueB
> * @return int
> */
> function test($iValueA, $iValueB) {
> return $iValueA * $iValueB;
> }
>
> $oXmlRpcServer->addFunction('test'); // call: test
>
> /***********************************************************/
>
> -- Jan
>
> >-- 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/