在PHP soapCall中为实际的函数标记添加属性

时间:2013-03-18 15:50:55

标签: php soap soap-client

我需要在表示调用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序列化器迭代才能发送请求。

1 个答案:

答案 0 :(得分:0)

看起来在上面的代码中缺少结束双引号。

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

另请参阅此帖以获取替代方法。 PHP SoapVar Object Attribute?