我需要向表示调用soap接口(特别是zimbra接口)中的函数/方法的标记添加属性。
我理解如何将属性添加到参数标记中,而不是添加到实际的方法标记中。
例如,要将它们添加到参数中,可以这样做: $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="s3cr3tP@ss" />
</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序列化器迭代只是为了能够发送请求。
上面的代码好像缺少一个结束双引号。
$var = new SoapVar('<SetPasswordRequest id="'.$accountInfo->id
.'" newPassword="'.$newPass.'"/>', XSD_ANYXML);
$params = array(new SoapParam($var, 'SetPasswordRequest'));
也可以参考这篇文章来获得另一种方法。SoapVar对象属性?