Приглашаем посетить
Сладков (sladkov.lit-info.ru)

Creating a Web Service with PEAR::XML-RPC

Previous
Table of Contents
Next

Creating a Web Service with PEAR::XML-RPC

Several XML-RPC implementations are out there, but the one most widely used and also in active development is PEAR::XML-RPC, available at http://pear.php.net/package/XML_RPC/. It is a PEAR port of another XML-RPC library and adds some fixes that didn't make it in the original distribution.You can install it with pear upgrade XML_RPC, to get the latest and greatest version.

To provide such a Web Service, you have to instantiate the XML_RPC_Server class and provide some information about the service: which function to use, its description, and, of course, the signature (which parameter types are passed, which data type is returned). The preceding code contains this information for a simple "add two numbers" Web Service.

Information about the XML-RPC Web Service (xmlrpc-pear-server.php; excerpt)
<?php
  require_once 'XML/RPC/Server.php';

  $description = 'adds two numbers';
  $signature = array(
    array('int', 'int', 'int')
  );

  $xmlrpc = new XML_RPC_Server(
    array('phrasebook.php.add' =>
      array(
        'function' => 'add',
        'docstring' => $description,
        'signature' => $signature
      )
    )
  );
?>

Note that the signature contains the data types of all input parameters plus the data type of the return value; that's why 'int' appears three times and not just twice.

Now the only thing missing is the actual business logic, the function to add. This is a bit tricky: First, the getParam() method returns all parameters provided to the function; then, the scalarval() retrieves the actual value of such a parameter. Then, the actual adding of the numbers can be done, by returning a suitable XML_RPC_Response object. For instance:

function add($params) {
  $a = $params->getParam(0);
  $b = $params->getParam(1);
  if (isset($a) && isset($b)) {
    if ($a->scalartyp() == 'int' && $b->scalartyp()
      == 'int') {
       $a = $a->scalarval();
       $b = $b->scalarval();
       $c = new XML_RPC_Value($a + $b, 'int');
       return new XML_RPC_Response($c);
    } else {
       global $XML_RPC_erruser;
       return new XML_RPC_Response(0,
         $XML_RPC_erruser,
         'wrong parameters');
    }
  }
}


Previous
Table of Contents
Next