SOAP-запрос с атрибутом - PullRequest
       17

SOAP-запрос с атрибутом

6 голосов
/ 25 августа 2009

Не могу понять, как установить атрибут для запроса SOAP без использования кодировки XSD_ANYXML .

Параметр запроса должен выглядеть следующим образом

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

Конечно, следующий код работает, но он довольно уродлив (уродлив, потому что он использует конкатенацию строк, где он должен использовать API-интерфейс SOAP_Client и потому что он не использует общее пространство имен)

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

Есть ли лучший способ создать параметр запроса SOAP с пространством имен и атрибутом?

Я ищу с.т. как показано ниже (это всего лишь некоторый псевдокод, использующий API SoapVar ):

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

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

Для этого вам нужно извлечь класс из 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();

Я надеюсь, что это решит вашу проблему.

0 голосов
/ 19 ноября 2010

SOAP 1 поддерживает атрибуты. Вот пример кода Perl, использующего как атрибуты, так и значения (из клиента):

$som = $client->call(
    'tran:getContent',
    SOAP::Header->name('cred:credentials')->attr({
        'username' => $username,
        'password' => 'xxx',
        'customerID' => 'xxx'}
    ),
    SOAP::Data->name('contentID')->value('9999')
)
0 голосов
/ 28 августа 2009

SOAP не поддерживает атрибуты, может быть, вы должны использовать вместо REST! ​​

EDIT: Пожалуйста, проверьте стиль тела w3c: "4.3 SOAP Body" и помните, что вам нужно закодировать ваше сообщение с пространством имен "soap-envelope" и описать ваши типы XML, поэтому вы не можете использовать атрибуты для описания данных вашего сообщения.

Но если вы спросите меня, это станет возможным! Вы можете использовать собственный анализатор SoapClient или что-то в этом роде и конвертировать ваше сообщение так, как вам нравится. Примером этого может быть RSS через SOAP http://www.ibm.com/developerworks/webservices/library/ws-soaprdf. Но проблема заключается в том, что вы упустите описательную информацию о ваших данных / типах сообщений, а другие клиенты не смогут легко понять ваши сообщения!

Моя лучшая практика для вас будет использовать элементы вместо атрибутов, я знаю, что вам нужно исправить свою XML-схему, но так оно и есть или перейти на другую технологию.

...