3

我的 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;
}
4

3 回答 3

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 的虚拟生成失败

于 2013-02-26T09:08:20.877 回答
1

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

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

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

我建议你试一试,我敢肯定,如果你使用这个库创建你的第一个 Web 服务,你将永远不会尝试其他东西。

我希望这可以帮助你。

于 2013-02-27T19:51:50.930 回答
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;
}

这基本上是:如果第一次不起作用,请再试一次。

于 2013-10-11T14:46:27.050 回答