繁体   English   中英

PHP SOAP /了解WSDL

[英]PHP SOAP / Understanding WSDL

弄清楚了,请参阅下面的更新。

我正在尝试通过PHP使用特定的Web服务(尝试了本机和Zend SOAP客户端),并且它仅返回失败状态。

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

有人可以看看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。

感谢您的协助。

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

XML解析错误是这样的:

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)
}

537行恰好在文件末尾之前。

我建议您将此报告到http://bugs.php.net/

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

致命错误:未捕获的SoapFault异常:[WSDL] SOAP错误:解析WSDL:无法从' https://qa.everbridge.net/ws3/services/WebServices3?wsdl '加载:文档末尾的其他内容在/.../wsdl.php:2中的堆栈跟踪:#0 /.../wsdl.php(2):SoapClient-> SoapClient(' https://qa.ever ...')#1 {main }在第2行的/.../wsdl.php中抛出

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

echo '<pre>';
var_dump($result);
echo '</pre>';
?>

我使用wget从该URL提取,在返回的文档末尾没有发现任何其他异常。 我并不是很了解WSDL,但是我会跟踪此错误的原因。

更新:

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

$curl = curl_init('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');    
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);

$wsdl_string = curl_exec($curl);

file_put_contents('/var/tmp/wsdl.xml',$wsdl_string);

try
{
    $service = new SoapClient('/var/tmp/wsdl.xml');
    $result = $service->retrieveMemberInfo(array('loginId', 'orgName', 'password'), array('firstname', 'lastname'));

    print '<pre>';
    var_dump($result);
    print '</pre>';
}
catch (Exception $e)
{
    print '<pre>';
    var_dump(libxml_get_last_error());
    print '</pre>';
}

当然,请删除调试代码。 您可能还需要在使用后删除该临时文件。

我尝试使用PHP错误提交中提供的示例在本地复制它。

$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'));

它正确获取WSDL文件并将其写入temp文件夹。 它是整个文件。

它仍然返回失败状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM