XMLRPC показывает ошибку -32601 (с использованием PHP) - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть следующий код ...

<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( )) . "
"; $ Г = $ c-> отправить ($ F); $ v = $ r-> value (); if (! $ r-> faultCode ()) { Распечатайте «Email is». $ email. " является " . $ v-> scalarval (). "
"; print "
я вернул это значение
" .
          htmlentities($r->serialize( )). "

\ n"; } еще { выведите «Fault:»; выведите «Code:». $ r-> faultCode (). "Причина" ". $ R-> faultString ()." '
"; } ?>

Мне нужно использовать WebService, расположенный по адресу http://ws.myserver.com/register/index.php.

Я передаю письмо в качестве параметра, а затем библиотека XMLRPC.inc закодирует его с использованием base64.

У меня хороший XML-запрос, показанный ниже:

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

BUUUT, когда я пытался получить ответ от сервера, я на следующую ошибку

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

Есть идеи? Я схожу с ума от того, как вызвать метод existEmail из моего PHP-кода ... Я уверен, что он есть, но я не знаю, что я что-то упустил ..

1 Ответ

2 голосов
/ 28 февраля 2012

Вы получаете сообщение об ошибке (Спецификация совместимости кода неисправности, версия 20010516) от конечной точки XMLRPC, с которой вы общаетесь.

Это определенный код ошибки:

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

Запрошенный вами метод RPC не найден сервером. Обратитесь в службу поддержки службы, которую вы используете, чтобы получить список всех доступных методов. Если этот метод должен быть доступен, обратитесь в службу поддержки и обсудите с ними проблему.

Вы спросили в комментарии:

Есть ли способ [проверить], какие методы доступны?

Это зависит от службы. В XMLRPC на sourceforge есть предложения по определенным методам, которые вы можете вызвать для получения информации о доступных функциях:

Самоанализ XML-RPC

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

Вы также можете попробовать, если он работает с вашим сервисом. AFAIK это обычные, я подвел краткий пример, вы найдете полный код ниже. См. Также вывод под кодом.

$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)));
}

Выход:

 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)

Вы можете найти исходный код здесь: Служба обнаружения XMLRPC

...