PHP-SOAP/WSDL

PHP-SOAP/WSDL,php,zend-framework,soap,wsdl,Php,Zend Framework,Soap,Wsdl,找到答案,请参阅下面的更新。 我试图通过PHP使用特定的web服务(尝试了本机和Zend SOAP客户端),但它只返回失败状态 我怀疑这与retrieveMemberInfo方法调用中的多个bean(authBean、memberInfoBean)有关 有人能看一下WSDL并为我指出通过PHP客户端调用这个特定方法的正确方向吗 以下是我到目前为止的情况: $service = new SoapClient('https://qa.everbridge.net/ws3/services/WebSe

找到答案,请参阅下面的更新。

我试图通过PHP使用特定的web服务(尝试了本机和Zend SOAP客户端),但它只返回失败状态

我怀疑这与retrieveMemberInfo方法调用中的多个bean(authBean、memberInfoBean)有关

有人能看一下WSDL并为我指出通过PHP客户端调用这个特定方法的正确方向吗

以下是我到目前为止的情况:

$service = new SoapClient('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');
$result = $service->retrieveMemberInfo(array('loginId', 'orgName', 'password'), array('firstname', 'lastname'));
var_dump($result);
更新

问题不在于最初认为的WSDL调用。它是retrieveMemberInfo方法调用中使用的参数的格式。以下是正确返回SOAP响应的完整解决方案:

$params->authBean->loginId = 'username';
$params->authBean->orgName = 'orgName';
$params->authBean->password = 'password';
$params->memberInfoBean->firstName = 'firstName';
$params->memberInfoBean->lastName = 'lastName';

$service = new SoapClient('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');
$result = $service->retrieveMemberInfo($params);

var_dump($result);
现在我只需要弄清楚如何解析返回的stdObject


感谢您的帮助。

问题似乎出现在方法调用之前:

致命错误:未捕获SoapFault 异常:[WSDL]SOAP-ERROR:正在分析 WSDL:无法从中加载 '' :文件末尾的额外内容 /../wsdl.php:2堆栈中的文档 跟踪:#0/../wsdl.php(2): SoapClient->SoapClient(“…”) #第2行的/../wsdl.php中抛出了1{main}


我使用wget从该URL获取,并且在返回的文档末尾没有注意到任何额外的内容。虽然我对WSDL了解不多,但我会跟踪这个错误的原因

更新:

在确认Artefactor的发现后,我有动力尝试解决方法:

object(LibXMLError)#1 (6) { ["level"]=> int(3) ["code"]=> int(5) ["column"]=> int(5) ["message"]=> string(41) "Extra content at the end of the document " ["file"]=> string(56) "https://qa.everbridge.net/ws3/services/WebServices3?wsdl" ["line"]=> int(537) }
$curl=curl\u init('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');    
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$wsdl\u string=curl\u exec($curl);
文件内容('/var/tmp/wsdl.xml',$wsdl\u string);
尝试
{
$service=newsoapclient('/var/tmp/wsdl.xml');
$result=$service->retrieveMemberInfo(数组('loginId','orgName','password')、数组('firstname','lastname');
打印“”;
var_dump($结果);
打印“”;
}
捕获(例外$e)
{
打印“”;
var_dump(libxml_get_last_error());
打印“”;
}

当然,删除调试代码。您可能还想在使用临时文件后删除它。

问题似乎出现在方法调用之前:

致命错误:未捕获SoapFault 异常:[WSDL]SOAP-ERROR:正在分析 WSDL:无法从中加载 '' :文件末尾的额外内容 /../wsdl.php:2堆栈中的文档 跟踪:#0/../wsdl.php(2): SoapClient->SoapClient(“…”) #第2行的/../wsdl.php中抛出了1{main}


我使用wget从该URL获取,并且在返回的文档末尾没有注意到任何额外的内容。虽然我对WSDL了解不多,但我会跟踪这个错误的原因

更新:

在确认Artefactor的发现后,我有动力尝试解决方法:

object(LibXMLError)#1 (6) { ["level"]=> int(3) ["code"]=> int(5) ["column"]=> int(5) ["message"]=> string(41) "Extra content at the end of the document " ["file"]=> string(56) "https://qa.everbridge.net/ws3/services/WebServices3?wsdl" ["line"]=> int(537) }
$curl=curl\u init('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');    
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$wsdl\u string=curl\u exec($curl);
文件内容('/var/tmp/wsdl.xml',$wsdl\u string);
尝试
{
$service=newsoapclient('/var/tmp/wsdl.xml');
$result=$service->retrieveMemberInfo(数组('loginId','orgName','password')、数组('firstname','lastname');
打印“”;
var_dump($结果);
打印“”;
}
捕获(例外$e)
{
打印“”;
var_dump(libxml_get_last_error());
打印“”;
}

当然,删除调试代码。您可能还想在使用临时文件后删除它。

这显然是PHP中的一个错误。文件未完全读取。WSDL本身没有问题

XML解析错误如下所示:

对象(LibXMLError)#1(6){ [“级别”]=> int(3) [“代码”]=> 内部(5) [“列”]=> 内部(5) [“消息”]=> 字符串(41)“文档末尾的额外内容 " [“文件”]=> 字符串(56)”https://qa.everbridge.net/ws3/services/WebServices3?wsdl" [“行”]=> 内部(537) } 第537行位于文件末尾之前


我建议您向

报告这显然是PHP中的一个bug。文件未完全读取。WSDL本身没有问题

XML解析错误如下所示:

对象(LibXMLError)#1(6){ [“级别”]=> int(3) [“代码”]=> 内部(5) [“列”]=> 内部(5) [“消息”]=> 字符串(41)“文档末尾的额外内容 " [“文件”]=> 字符串(56)”https://qa.everbridge.net/ws3/services/WebServices3?wsdl" [“行”]=> 内部(537) } 第537行位于文件末尾之前


我建议您将此报告给

我尝试在本地复制它,并使用PHP bug提交中提供的示例

它正确地获取WSDL文件并将其写入临时文件夹。这是整个文件


它仍然返回失败状态。

我尝试在本地复制它,并使用PHP bug提交中提供的示例

它正确地获取WSDL文件并将其写入临时文件夹。这是整个文件


它仍然返回失败状态。

显然已经有一个bug报告描述了这个确切的问题(分块编码等)。请参阅评论或直接投票,以表明您遇到了相同的问题。(我无法编辑我的答案,我一直在得到“解决你的问题”的猫)我将把我的投票和报告添加到列表中。感谢您的帮助。显然已经有一个bug报告描述了这个确切的问题(分块编码等)。请参阅评论或直接投票,以表明您遇到了相同的问题。(我无法编辑我的答案,我一直在得到“解决你的问题”的猫)我将把我的投票和报告添加到列表中。谢谢你的帮助。你最好使用tempnam(),或者如果你不介意的话只下载一次wsdl,它不会改变。否则,当脚本的多个实例同时运行时,您将遇到问题。@好的一点是,我没有想到这一点。这仅仅是usi概念的证明 object(LibXMLError)#1 (6) { ["level"]=> int(3) ["code"]=> int(5) ["column"]=> int(5) ["message"]=> string(41) "Extra content at the end of the document " ["file"]=> string(56) "https://qa.everbridge.net/ws3/services/WebServices3?wsdl" ["line"]=> int(537) }
$tmpWsdlPath = tempnam(sys_get_temp_dir(), 'wsdl');
copy("https://qa.everbridge.net/ws3/services/WebServices3?wsdl", $tmpWsdlPath);
$service = new SoapClient($tmpWsdlPath);
$result = $service->retrieveMemberInfo(array('loginId', 'orgName', 'password'), array('firstName', 'lastName'));