2013-03-18 101 views
4

我需要在調用soap接口(特別是zimbra接口)時將屬性添加到代表函數/方法的標籤中。將屬性添加到PHP中的實際功能標籤soapCall

我瞭解如何將屬性添加到參數標記,但不是實際的方法標記。

例如,將它們添加到參數,人們可能會做這樣的事情:

$var = new SoapVar('<account by="name">' . $account . '</account>', XSD_ANYXML); 
    $params = array(new SoapParam($var, 'account')); 

    try { 
     $result = $this->SoapClient->__soapCall(
      "GetAccountInfoRequest", $params, null, $header 
     ); 
    } catch (SoapFault $fault) { 
     return false; 
    } 

這將產生以下預期的XML:

<body> 
    <GetAccountInfoRequest> 
     <account by="name">*someAccountName*</account> 
    </GetAccountInfoRequest> 
</body> 

但會發生什麼,當一個需要添加屬性到實際的方法標記,例如在Zimbra setPasswordRequest中。

即請求期待XML不不同於以下:

<body> 
    <SetPasswordRequest id="someAccountId" newPassword="[email protected]" /> 
</body> 

這簡直是表示與屬性和0參數的方法中的標記。

我試過以下(沒有用):

$var = new SoapVar('<SetPasswordRequest id="'.$accountInfo->id 
     .' newPassword="'.$newPass.'"/>', XSD_ANYXML); 
    $params = array(new SoapParam($var, 'SetPasswordRequest')); 

    try { 
     $result = $this->SoapClient->__soapCall(
      "SetPasswordRequest", $params, null, $header 
     ); 
    } catch (SoapFault $fault) { 
     return false; 
    } 

其中,令我懊惱的是,創建一個嵌套的標籤如下所示:

<body> 
    <ns1:SetPasswordRequest> 
     <SetPasswordRequest id="5329ee70-fb5b-4fa1-a6cb-4c5a3f7f8a91 newPassword="DpJsPX3w?"/> 
    </ns1:SetPasswordRequest> 
</body> 

目前,我爲這樣的請求手動序列化soap XML,並使用curl發送它,但是必須有一種方法可以使用SoapClient完成此操作,我擔心代碼的可讀性和可移植性,因爲未來的開發人員可能會對此產生影響,我不希望有人必須學會使用我自己的SOAP序列化器的迭代,以便能夠發現d請求。

+0

嗨,我有同樣的問題,你找到一個解決方案嗎?謝謝 – Vincent 2015-06-02 00:40:34

+0

@Vincent不幸的是,我只是繼續爲需要它的部分手動序列化肥皂。 – 2015-06-08 19:33:49

+0

非常感謝您花時間回覆,我最終也使用了相同的解決方案(不是很乾淨,但至少可以工作)。 – Vincent 2015-06-09 08:27:32

回答

0

看起來像在上面的代碼中缺少結束雙引號。

$var = new SoapVar('<SetPasswordRequest id="'.$accountInfo->id 
     .'" newPassword="'.$newPass.'"/>', XSD_ANYXML); 
    $params = array(new SoapParam($var, 'SetPasswordRequest')); 

另外參考這篇文章的另一種方法。 PHP SoapVar Object Attribute?