Question

I have the following code...

<?php
include("lib/xmlrpc.inc");

$email='whatever@hotmail.com';

$c=new xmlrpc_client("/register/index.php", "ws.myserver.com", 80);
$f=new xmlrpcmsg('existsEmail', array(new xmlrpcval($email, "base64")));
print "<pre>" . htmlentities($f->serialize( )) . "</pre>";

$r=$c->send($f);
$v=$r->value( );

if (!$r->faultCode( )) {
    print "Email is". $email . " is " .
          $v->scalarval( ) . "<br />";
          print "<hr />I got this value back<br /><pre>" .
          htmlentities($r->serialize( )). "</pre><hr />\n";
} else {
    print "Fault: ";
    print "Code: " . $r->faultCode( ) .
    " Reason '" .$r->faultString( )."'<br />";
}

?>

I need to consume the WebService located at http://ws.myserver.com/register/index.php.

I pass the email as a parameter and then the XMLRPC.inc library will encode it using base64.

I've got a good XML request shown below:

<?xml version="1.0"?>
<methodCall>
<methodName>existsEmail</methodName>
<params>
<param>
<value><base64>dnJvZHJpZ3VlekBpY2NrLm5ldC5jbw==</base64></value>
</param>
</params>
</methodCall>

BUUUT, when I tried to get a response from the server I've to the following error

Fault: Code: -32601 Reason 'server error. requested method not found'

Any ideas? I'm getting crazy about how to call the existsEmail method from my PHP code...I'm sure it is there but I don't know if I'm missing something..

Was it helpful?

Solution

You are getting an error message (Specification for Fault Code Interoperability, version 20010516) from the XMLRPC endpoint you're communicating with.

It is a defined error code:

-32601 ---> server error. requested method not found

The RPC method you requested was not found by the server. Contact the support of the service you consume to get a list of all available methods. If that method should be available, contact the support and discuss the issue with them.

You asked in comment:

Is there any way [to] verify which methods are available?

That depends on the service. XMLRPC on sourceforge has a suggestion of defined methods you can call to list information about the functions available:

XML-RPC Introspection

  • system.listMethods
  • system.methodSignature
  • system.methodHelp

You can try if it works with your service, too. AFAIK those are common, I wrapped up a quick example, you find the full code below. See the output below the code as well.

$path = 'http://xmlrpc-c.sourceforge.net/api/sample.php';

printf("\n XMLRPC Service Discovery\n\n for: '%s'\n\n", $path);

$discovery = new Discovery($path);
$methods = $discovery->getMethods();

printf(" Method Summary:\n ===============\n", count($methods));
foreach ($methods as $i => $method)
{
    printf(" %'.-2d %s\n", $i + 1, $method->getName());
}

printf("\n Method Details (%d):\n ===================\n", count($methods));
foreach ($methods as $i => $method)
{
    printf("  %'.-2d %s\n", $i + 1, $method->getName());
    printf("\n       %s\n", $method);
    printf("\n%s\n\n", preg_replace('/^/um', '     ', wordwrap($method->getHelp(), 46)));
}

Output:

 XMLRPC Service Discovery

 for: 'http://xmlrpc-c.sourceforge.net/api/sample.php'

 Method Summary:
 ===============
 1. debug.authInfo
 2. sample.add
 3. sample.sumAndDifference
 4. system.listMethods
 5. system.methodHelp
 6. system.methodSignature

 Method Details (6):
 ===================
  1. debug.authInfo

       <struct> debug.authInfo

     Report any HTTP authentication in use

  2. sample.add

       <int> sample.add (<int>, <int>)

     Add two numbers

  3. sample.sumAndDifference

       <struct> sample.sumAndDifference (<int>, <int>)

     Add and subtract two numbers

  4. system.listMethods

       <array> system.listMethods (<string>)

     This method lists all the methods that the
     XML-RPC server knows how to dispatch

  5. system.methodHelp

       <string> system.methodHelp (<string>)

     Returns help text if defined for the method
     passed, otherwise returns an empty string

  6. system.methodSignature

       <array> system.methodSignature (<string>)

     Returns an array of known signatures (an array
     of arrays) for the method name passed. If no
     signatures are known, returns a none-array
     (test for type != array to detect missing
     signature)

You can find the sourcecode here: XMLRPC Discovery Service

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top