4

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 シリアライザーの独自の反復を使用する方法を誰かに学ばせなければならないようにしたくありません。

4

1 に答える 1

0

上記のコードでは、終了の二重引用符が欠落しているようです。

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

別のアプローチについては、この投稿も参照してください。 PHP SoapVar オブジェクト属性?

于 2015-07-11T05:00:25.630 に答える