Xpoint
   [напомнить пароль]

Добавить NameSpace для элементов SOAP-header

Метки: [без меток]
2010-03-16 18:39:53 [обр] Александр Носов(6/9)[досье]

Задача: для каждого элемента, который входит в SOAP-header задать NameSpace.

Заголовок у меня имеет сложную (многоуровневую) структуру.
В настоящий момент мне удалось задать NameSpace только для тегов входящих непосредственно в <env:Header>. Для тегов лежащих глубже NameSpace мне добавить не удалось.

В этой связи у меня два вопроса:

  • PHP, в принципе, позволяет добавлять NameSpace в произвольные элементы SOAP-header? Если да, то как?
  • зависит ли структура SOAP-header (и в частности NameSpace) от WSDL-файла (возможно проблема в том, что на сервере не правильно формируется WSDL-файл)?

Вот пример "простого" кода, который я использовал у себя для тестирования:

<pre><?php
$sWsdl   = 'http://my_wsdl';
$sNs     = 'http://test.com';
$sMethod = 'myMethod';
$aArg    = array();

$aHeader = array(
    'ses_key1' => 'XXXXXX',
    'ses_key2' => 'YYYYYY',
);
$aVarParam = array(
    //'type_name' => 'ses_key',
    //'type_namespace' => $sNs,
    //'node_name' => 'ses_key',
    'node_namespace' => $sNs,
);
$oSoapVar = new SoapVar(
    $aHeader,
    SOAP_ENC_OBJECT, //SOAP_ENC_ARRAY,
    @$aVarParam['type_name'],
    @$aVarParam['type_namespace'],
    @$aVarParam['node_name'],
    @$aVarParam['node_namespace']
);


$oSoapHeader = new SoapHeader($sNs, 'session_keys', $oSoapVar);

$oSoapClient = new SoapClient(
    $sWsdl,
    array(
        'soap_version' => SOAP_1_2,
        'trace'        => 1,
    )
);
$oSoapClient->__soapCall($sMethod, $aArg, array(), $oSoapHeader);


$oXml = DOMDocument::loadXML($oSoapClient->__getLastRequest());
$oXml->formatOutput = true;
echo htmlspecialchars($oXml->saveXML());

?></pre>

И сейчас я получаю вот такой результат:

  <env:Header>
    <ns1:session_keys>
      <ses_key1>XXXXXX</ses_key1>
      <ses_key2>YYYYYY</ses_key2>
    </ns1:session_keys>
  </env:Header>

А мне необходим вот такой результат (везде "ns1:"):

  <env:Header>
    <ns1:session_keys>
      <ns1:ses_key1>XXXXXX</ses_key1>
      <ns1:ses_key2>YYYYYY</ses_key2>
    </ns1:session_keys>
  </env:Header>

К сожалению, внешний УРЛ к моему WSDL-файлу я дать не могу. Если у кого-то нет своего SOAP-сервера для экспериментов, но есть идеи как реализовать данную задачу - пишите здесь. Я буду экспериментировать и докладывать о результатах.

Powered by POEM™ Engine Copyright © 2002-2005