2013-03-18 77 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?