2012-02-28 6 views
2

У меня есть следующий код ...XMLRPC показывает -32601 ошибку (с помощью PHP)

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

$email='[email protected]'; 

$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 />"; 
} 

?> 

мне нужно потреблять 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'

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

ответ

2

Вы получаете error message (Specification for Fault Code Interoperability, version 20010516) с конечной точки XMLRPC, с которой вы общаетесь.

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

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

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

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

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

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

XML-RPC Introspection

  • 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 Discovery Service

+0

Благодаря hakre ... вы думаете, что я не в состоянии потреблять веб-сервиса, потому что что-то не хватает от них ? Я думаю, что все в порядке ..есть ли способ проверить, какие методы доступны? – Leo

+0

@ Leo, я продлил ответ. Это может быть информация, которую вы ищете. – hakre

+0

Привет, Hakre ... Я выяснил, что это неправильно. Мне не хватало префикса для метода, это должно быть «reg.existsEmail», а также значение «string» или «base64», потому что Webservice имеет возможность получить уже закодированная строка ... Во всяком случае, эта помощь от вас - УДИВИТЕЛЬНАЯ !!! Я буду использовать его для проверки некоторых других функций моего поставщика услуг WS – Leo

Смежные вопросы