看似随机的SoapFault:不是一个有效的方法

时间:2013-02-07 13:56:35

标签: php soap wsdl zend-soap

我遇到了SOAP解决方案的问题。有时我会收到错误说明以下内容:

Function (functionA) is not a valid method for this service

8个月后编辑 虽然我找不到问题的原因但我能够解决它。每当我收到来自API的响应时,我都会检查SoapFault并发送另一个相同的请求并使用第二次返回的答案。(作为答案发布)

这种情况发生在来自PHP的调用中:

functionA() - expected response
functionA() - expected response
functionA() - SoapFault
functionA() - expected response

在所有上述调用中都需要相同的结果,并且使用相同的参数(如果有的话)。由于几乎所有调用都能正常工作,我知道函数和相应的WSDL就在那里。

我认为问题在于缓存一个不具备该功能的旧版本。我尝试用以下方法禁用缓存:

ini_set("soap.wsdl_cache_enabled", "0");

使用随机伪参数添加每个调用以及在使用Zend_SoapClient时禁用它。

'cache_wsdl' = false

我希望有人能指出我的任何方向或对可能的原因有任何直接的建议。

我的代码如下:

public function __construct()
{
        $wsdl =  "http://catlovers.nl/index.php?wsdl&dummy=".rand(1000,9999);

        $this->_client = new Zend_Soap_Client($wsdl, array(
            'soapVersion' => SOAP_1_1,
            'cache_wsdl' => false 

        ));
        $this->_client->setWsdlCache(false);
}

function __call($name, $arguments) // Calls are made this way
{
    array_unshift($arguments, $this->_apiKey, $this->_user, $this->_password);
    return call_user_func_array(array($this->_client, $name), $arguments);
}
public function getCat()
{
    return ($this->__call('getCat',array()));
}

在“另一边”我有:

$server = new nusoap_server();

$server->wsdl->addComplexType('Cat', ....

$server->register( 'getCat', return Cat ...

function getCat($apikey, $email, $password)
{
  $cat = $db->get("redCat");
  return $cat;
}

3 个答案:

答案 0 :(得分:3)

首先,尝试使用内置的SoapClient类调用函数并打印调试信息:

$wsdl =  "http://abcd.com/index.php?wsdl&dummy=".rand(1000,9999);
$soap = new SoapClient($wsdl, array(
   'cache_wsdl' => WSDL_CACHE_NONE,
   'trace' => true,
));

try {
    var_dump($soap->functionA());
} catch ( Exception $ex ) {
    var_dump($ex);
}
var_dump($soap->__getLastRequest());
var_dump($soap->__getLastRequestHeaders());
var_dump($soap->__getLastResponse());
var_dump($soap->__getLastResponseHeaders());

这样你就会知道问题出在哪里。如果一切都好,那问题就在Zend的课上。如果没有,看看哪些服务响应。可能存在一些服务器端错误或虚假生成,这样的id失败

答案 1 :(得分:1)

我猜你的问题与nusoap有关,因为多年来我一直在使用PHP soap服务器/客户端而且我从未遇到过这个问题。 (但我总是遇到nusoap lib的奇怪问题)

目前我正在使用jool.nl web service helper这是非常强大而又整洁且面向对象的库不仅使编码更容易和更清晰,而且还为您提供面向对象的Web服务设计方法。它还为您的Web服务提供了一个很好的Web界面和文档。

由于这个库使用内部PHP SOAP服务器,我很确定你的问题会消失。

我建议你尝试一下,我敢肯定,如果你使用这个库制作第一个网络服务,你将永远不会尝试别的东西。

我希望这会对你有所帮助。

答案 2 :(得分:0)

所以在尝试其他解决方案之后问题仍然存在,所以我永远无法找到问题的根本原因。另一方面,我找到了解决自编写以来一直有效的问题的方法。这就是我对API的调用与用户,密码和密钥进行身份验证的方式。

function __call($name, $arguments)
{
    /* Using the stored data to ensure that the user is allowed to access */
    /* ............... */

    array_unshift($arguments, $this->_apiKey, $this->_user, $this->_password);
    $call = call_user_func_array(array($this->_client, $name), $arguments);
    if(isset($call->faultstring) && substr(trim($call->faultstring),0,7) == "Function")
    {
        $recall = call_user_func_array(array($this->_client, $name), $arguments);
        return $recall;
    }
    else
        return $call;
}

这是基本的:如果它第一次不起作用再试一次。