Запрос SOAP с атрибутом

Я не могу понять, как установить атрибут для запроса 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 с пространством имен и атрибутом?

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

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

Solutions Collecting From Web of "Запрос SOAP с атрибутом"

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

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

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

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

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

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

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') )