2017-02-15 11 views
3

я не знаю, как бы это, но я должен был отправить запрос SOAP с следующим форматом:Несоответствие ns1 и tem в запросе SOAP влияет на запрос?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:tem="http://tempuri.org/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:RequestTopup> 
      <tem:sClientUserName>?</tem:sClientUserName> 
      <tem:sClientPassword>?</tem:sClientPassword> 
      <tem:sClientTxID>?</tem:sClientTxID> 
      <tem:sProductID>?</tem:sProductID> 
      <tem:dProductPrice>?</tem:dProductPrice> 
      <tem:sCustomerAccountNumber>?</tem:sCustomerAccountNumber> 
      <tem:sCustomerMobileNumber>?</tem:sCustomerMobileNumber> 
      <tem:sEncKey>?</tem:sEncKey> 
     </tem:RequestTopup> 
    </soapenv:Body> 
</soapenv:Envelope> 

Моего PHP код был, как показано ниже:

$opts = array(
    'ssl' => array('ciphers' => 'RC4-SHA', 'verify_peer' => false, 'verify_peer_name' => false) 
); 

$params = array(
    'encoding' => 'UTF-8', 
    'verifypeer' => false, 
    'verifyhost' => false, 
    'trace' => 1, 'exceptions' => 1, 
    "connection_timeout" => 180, 
    'stream_context' => stream_context_create($opts) 
); 



$client = new SoapClient("http://xmpl/connect.asmx?WSDL", $params);  

    $txn_id = "2017021234567"; 

$result = $client->RequestTopup(
    array(
     'sClientUserName' => '6', 
     'sClientPassword' => '123456789', 
     'sProductID' => '1', 
     'dProductPrice' => '10', 
     'sClientTxID' => $txn_id, 
     'sCustomerAccountNumber' => '60166527234', 
     'sCustomerMobileNumber' => '60166527234', 
     'sEncKey' => 'sample_enc', 
    ) 
); 

echo $client->__getLastRequest(); 

Теперь проблема это генерирует xml в правильном формате, но заменяет все «тем» на «ns1». Мне жаль это говорить, но я даже не знаю, что разница между этими двумя и googling не помогли.

Будет ли это иметь значение, если я попрошу xml с «ns1»? Или я должен изменить его на «тем», как ожидает его клиент? Пожалуйста помоги.

ответ

1

Не следует. Префикс пространства имен ссылается только на фактическое пространство имен (значение в узле определения пространства имен xmlns:*). Префиксы являются необязательными для узлов элементов и могут меняться на каждом узле элемента. Таким образом, tem:RequestTopup должно быть фактически указано как {http://tempuri.org/}RequestTopup. Вот 3 примера, что все решить к узлу в пространстве имен http://tempuri.org/ с локальным именем RequestTopup

  • <tem:RequestTopup xmlns:tem="http://tempuri.org/"/>
  • <ns1:RequestTopup xmlns:ns1="http://tempuri.org/"/>
  • <RequestTopup xmlns="http://tempuri.org/"/>

Однако, я видел гораздо больше неверную реализацию то я бы хотел. Они часто полагаются на определенные префиксы пространства имен и игнорируют фактическое пространство имен.

+0

спасибо большое .. вы сделали все ясно .. есть ли какой-либо способ, однако, заменить те ns1 на tem? –

+0

Вам нужно будет воссоздать узлы XML. Я применил оптимизатор в FluentDOM, который можно использовать для этого: https://github.com/FluentDOM/FluentDOM/blob/master/examples/Transformer/Namespaces/optimize.php – ThW