【问题标题】:XMLRPC showing -32601 error (using PHP)XMLRPC 显示 -32601 错误(使用 PHP)
【发布时间】:2012-03-18 02:39:01
【问题描述】:

我有以下代码...

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

?>

我需要使用位于 http://ws.myserver.com/register/index.php 的 WebService。

我将电子邮件作为参数传递,然后 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'

有什么想法吗?我对如何从我的 PHP 代码中调用 existsEmail 方法感到疯狂……我确定它在那里,但我不知道我是否遗漏了什么……

【问题讨论】:

    标签: php web-services xml-rpc xmlrpclib xmlrpcclient


    【解决方案1】:

    您正在从与之通信的 XMLRPC 端点获得error message (Specification for Fault Code Interoperability, version 20010516)

    这是一个已定义的错误代码:

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

    服务器找不到您请求的 RPC 方法。请联系您使用的服务的支持人员以获取所有可用方法的列表。如果该方法可用,请联系支持人员并与他们讨论问题。

    你在评论中提问:

    有什么方法[来]验证哪些方法可用?

    这取决于服务。 sourceforge 上的 XMLRPC 建议您可以调用已定义的方法来列出可用功能的相关信息:

    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

    【讨论】:

    • 谢谢 hakre...您认为我无法使用 Web 服务是因为它们缺少某些东西吗?我认为没关系..有什么方法可以验证哪些方法可用?
    • @Leo,我扩展了答案。这可能就是您要查找的信息。
    • 嗨哈克雷...我发现错了..我错过了方法的前缀,它应该是'reg.existsEmail'并且值是“string”,也不是“base64”因为 Web 服务必须收到一个已经编码的字符串......无论如何,你的帮助真是太棒了!我将使用它来验证我的 WS 提供商提供的其他一些功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2011-04-23
    • 2012-08-02
    • 2011-05-31
    相关资源
    最近更新 更多