2012-03-07 4 views
5

Я пытаюсь просто отправить RAW xml в webservice через PHP и SoapClient. Проблема в том, что когда я кодирую свой XML, он меняет порядок элементов в XML, который преобразуется в ассоциативный массив.Отправка Raw XML через PHP SoapClient request

// Initialize the Soap Client: 
$this->_transactionServicesClient = new SoapClient($soapWSDLUrl); 

Как или что было бы лучшим способом отправить следующий XML-код в мой SoapClient?

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.micros.com/pos/les/TransactionServices"> 
    <SOAP-ENV:Body> 
     <ns1:PostTransaction> 
      <ns1:REQ> 
       <ns1:RequestHeader> 
        <ns1:InterfaceVersion>3.0.7</ns1:InterfaceVersion> 
        <ns1:ClientName>TRANS_SERVICES</ns1:ClientName> 
       </ns1:RequestHeader>  
       <ns1:CheckDetailEntries> 
        <ns1:MenuItem> 
         <ns1:ReferenceEntry>Pizza4</ns1:ReferenceEntry> 
         <ns1:Count>1</ns1:Count> 
         <ns1:Price>10.00</ns1:Price> 
         <ns1:ItemNumber>112001</ns1:ItemNumber> 
         <ns1:PriceLevel>1</ns1:PriceLevel> 
         <ns1:Seat xsi:nil="true"/> 
        </ns1:MenuItem> 
       </ns1:CheckDetailEntries> 
       <ns1:CheckHeaderRequest> 
        <ns1:CheckId>03:21:05.050505</ns1:CheckId> 
        <ns1:GuestCount>1</ns1:GuestCount> 
        <ns1:GuestInformation> 
        <ns1:ID>001</ns1:ID> 
        <ns1:FirstName>xxx</ns1:FirstName> 
        <ns1:LastName>xxx</ns1:LastName> 
        <ns1:Address1>xxx Rd</ns1:Address1> 
        <ns1:Address2>xx</ns1:Address2> 
        <ns1:Address3>xx</ns1:Address3> 
        <ns1:PhoneNum>xx</ns1:PhoneNum> 
        <ns1:UserText1>None</ns1:UserText1> 
        <ns1:UserText2>None</ns1:UserText2> 
        <ns1:UserText3>None</ns1:UserText3> 
        <ns1:GUID></ns1:GUID></ns1:GuestInformation> 
       </ns1:CheckHeaderRequest> 
       <ns1:OrderTypeNumber>1</ns1:OrderTypeNumber> 
      </ns1:REQ> 
     </ns1:PostTransaction> 
    </SOAP-ENV:Body>   
</SOAP-ENV:Envelope> 

Update/Разрешение: Вот код, который я использовал для расширения SOAP клиента и отправить мое сырое мыло Конверт: My answer below

+0

Я в замешательстве - вы отправляете этот XML-код в службу SOAP, и он не обрабатывается или у вас есть XML, который вы хотите отправить внутри сообщения SOAP? – enygma

+0

У меня XML, я хочу отправить сообщение с мылом. Когда я отправляю данные, закодированные в ассоциативном массиве, узлы теряют свой первоначальный порядок, который прерывает запрос. Пример: внутри CheckDetailEntries вы можете использовать теги MenuItem или Condiment. Но, чтобы связать Приправы с MenuItems, они должны быть в определенном порядке, который теряется при кодировании XML. Поэтому мне просто нужно отправить XML-строку методу PostTransaction для обработки. – Fostah

+0

Есть ли другой способ, которым вы могли бы связать их? Опираясь на порядок входящего XML кажется немного хрупким для меня ... – enygma

ответ

7

Update/Разрешение: Вот код, который я использовал для расширения SOAP клиента и отправить мое сырое мыло Конверт

Вот как я расширен SoapClient:

<?php 
class MySoapClient extends SoapClient { 

    function __construct($wsdl, $options) { 
     parent::__construct($wsdl, $options); 
     $this->server = new SoapServer($wsdl, $options); 
    } 
    public function __doRequest($request, $location, $action, $version) 
    { 
     $result = parent::__doRequest($request, $location, $action, $version); 
     return $result; 
    } 
    function __myDoRequest($array,$op) { 
     $request = $array; 
     $location = 'http://xxxxx:xxxx/TransactionServices/TransactionServices6.asmx'; 
     $action = 'http://www.micros.com/pos/les/TransactionServices/'.$op; 
     $version = '1'; 
     $result =$this->__doRequest($request, $location, $action, $version); 
     return $result; 
    } 
} 

// To invoke my new custom method with my Soap Envelope already prepared. 
$soapClient = new MySoapClient("http://xxxx:xxxx/TransactionServices/TransactionServices6.asmx?WSDL", array("trace" => 1)); 
$PostTransaction = $soapClient->__myDoRequest($orderRequest,$op); 
?> 

Также размещены на pastie.org: http://pastie.org/3687935, прежде чем я повернул это в ответ.

+4

Вы просто передали свою XML-строку как $ orderRequest? – fibono

4

Для целей тестирования, вы можете создать подкласс SoapClient и переопределить метод __doRequest - он получает сгенерированный XML, и вы можете его предварительно обработать.

Но лучше найти, что не так с кодировкой XML. Вы можете использовать экземпляры SoapVar и SoapParam для указания точного способа представления данного объекта. Те, спас мою жизнь, когда пространство имен должно было быть дано

+0

Что происходит, когда мой XML кодируется в ассоциативный массив, он теряет порядок элементов внутри CheckDetailEntries. В моем XML у меня есть MenuItem, Condiment, MenuItem, Condiment. Но когда XML преобразуется, он группирует [MenuItems] [0] и [MenuItems] [1], который затем при декодировании делает заказ MenuItem, MenuItem, Condiment, Condiment, который заставляет оба приправы ассоциироваться с последним MenuItem. Я буду смотреть в SoapVar и SoapParam. Благодаря! – Fostah

+0

Можно ли отправить _soapCall с именем функции и вместо отправки аргументов в качестве массива я могу вместо этого отправить XML-строку? Я не могу понять, как это сделать. Благодаря! – Fostah

+0

@Fostah, поскольку вы приняли ответ, очевидно, это помогло вам отладить/исправить программу, но не могли бы вы точно указать, в чем причина неправильного XML? –

 Смежные вопросы

  • Нет связанных вопросов^_^