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.

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.

*) 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>


Reply via email to