7

XSD_ANYXMLエンコーディングを使用せずにSOAPリクエストに属性を設定する方法を見つけることができないようです。

リクエストパラメータは次のようになります

<request
    xmlns:ns="/some/ns">
    ...
        <ns:parameter attr="some attribute">
            value
        </ns:parameter>
    ...
</request>

もちろん、次のコードは機能しますが、かなり醜いです(SOAP_Client APIを使用する必要がある場所で文字列連結を使用し、一般的な名前空間を使用しないため、醜いです)

$param = new SoapVar(
    '<ns_xxx:parameter xmlns:ns_xxx="/some/ns" attr="some attribute">
        value
     </ns_xxx:parameter>',
    XSD_ANYXML
);

名前空間と属性を使用してSOAPリクエストパラメータを作成するためのより良い方法はありますか?

s.thを探しています。次のようになります(これは、 SoapVar APIを使用した疑似コードです)。

$param = new SoapVar(
    array(
        '_' => 'value',
        'attr' => 'some attribute'
    ), 
    SOME_ENCODING,
    null,
    null,
    null,
    '/some/ns'
);
4

3 に答える 3

3

このためには、SoapClientからクラスを派生させ、メソッド__doRequest()をオーバーライドする必要があります。

class ABRSoapClient extends SoapClient {

    // return xml request
    function __doRequest($request, $location, $action, $version) {
        $dom = new DOMDocument('1.0', 'UTF-8');
        $dom->preserveWhiteSpace = false;
        $xml= $dom->loadXML($request);
        // Goto request Node and Set the attribute
        $attr_ns = $dom->createAttributeNS('xmlns:ns', '' ); // instead of xmlns:ns use Namespace URL
        $attr_ns->value = '/some/ns';
        // add atribute in businessReport node 
        $dom->getElementsByTagName($report_type)->item(0)->appendChild( $attr_ns );   
        $request = $dom->saveXML();
        return parent::__doRequest($request, $location, $action, $version);
    }
}

$client = new ABRSoapClient(.....);
$save_result = $client->request($param);

// You can check the form request using function
$client->__getLastRequest();

これで問題が解決することを願っています。

于 2011-08-18T13:37:06.193 に答える
0

SOAP は属性をサポートしていません。代わりに REST を使用する必要があります。

編集: 本文のスタイル w3c:"4.3 SOAP Body" を確認してください。また、"soap-envelope" 名前空間を使用してメッセージをエンコードし、XML タイプを記述する必要があることに注意してください。属性を使用してメッセージ データを記述することはできません。

でも、頼めばできる!カスタム SoapClient パーサーなどを使用して、メッセージを好きなように変換できます。その例として、RSS over SOAP http://www.ibm.com/developerworks/webservices/library/ws-soaprdfがあります。しかし、問題は、メッセージのデータ/タイプに関する説明情報を見落としてしまい、他のクライアントがメッセージを簡単に理解できないことです!

私のベスト プラクティスは、属性の代わりに要素を使用することです。XML スキーマを修正する必要があることはわかっていますが、その方法に従うか、他のテクノロジに切り替える必要があります。

于 2009-08-27T23:07:18.643 に答える
-3

SOAP1は属性をサポートします。以下は、(クライアントからの)属性と値の両方を使用するPerlコードの例です。

$som = $client->call(
    'tran:getContent',
    SOAP::Header->name('cred:credentials')->attr({
        'username' => $username,
        'password' => 'xxx',
        'customerID' => 'xxx'}
    ),
    SOAP::Data->name('contentID')->value('9999')
)
于 2010-11-19T01:02:45.193 に答える