我遇到了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;
}
答案 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;
}
这是基本的:如果它第一次不起作用再试一次。