-- 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/

Reply via email to