簡體   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