2012-03-07 25 views
5

Próbuję po prostu wysłać RAW xml do usługi sieciowej za pomocą PHP i SoapClient. Problem polega na tym, że kiedy koduję mój XML, zmienia on kolejność elementów w XML, który jest konwertowany do tablicy asocjacyjnej.Wysyłanie nieprzetworzonego XML za pomocą PHP Prośba o moduł SoapClient

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

Jak lub jaki byłby najlepszy sposób na przesłanie poniższego XML jako ciąg do mojego 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> 

Aktualizacja/Rozdzielczość: Oto kod użyłem do rozszerzenia klienta SOAP i wysłać moje surowe Koperta Mydło: My answer below

+0

Jestem zdezorientowany - czy wysyłasz ten XML do usługi SOAP i nie jest on przetwarzany lub masz XML, który chcesz wysłać wewnątrz komunikatu SOAP? – enygma

+0

Mam XML Chcę wysłać wiadomość mydła. Kiedy wysyłam dane zakodowane w tablicy asocjacyjnej, węzły tracą oryginalną kolejność, która przerywa żądanie. Przykład: wewnątrz CheckDetailEntries możesz mieć znaczniki MenuItem lub Condiment. Ale aby skojarzyć Condiments z MenuItems, muszą one być w określonej kolejności, która jest tracona podczas kodowania XML. Tak więc wystarczy wysłać ciąg znaków XML do metody PostTransaction do przetworzenia. – Fostah

+0

Czy istnieje inny sposób, w jaki można je skojarzyć? Poleganie na kolejności przychodzących XML wydaje mi się trochę krucha ... – enygma

Odpowiedz

7

Aktualizacja/Rozdzielczość: Oto kod użyłem do rozszerzenia klienta SOAP i wysłać moje surowego mydła Koperta

Oto jak ja przedłużony 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); 
?> 

pisał także na pastie.org: http://pastie.org/3687935 zanim zwróciłem na to odpowiedź.

+4

Czy właśnie przekazałeś ciąg znaków XML jako $ orderRequest? – fibono

4

Dla celów testowych można podklasy SoapClient i przesłonięcie metody __doRequest - otrzymuje wygenerowany XML i można go wstępnie przetworzyć.

Ale lepiej znajdź, co jest nie tak z kodowaniem XML. Możesz użyć instancji SoapVar i SoapParam, aby określić dokładny sposób reprezentacji danego obiektu. Ci, uratował mi życie, kiedy nazw musiał mieć

+0

Co się dzieje, gdy mój XML jest kodowany do tablicy asocjacyjnej, traci kolejność elementów wewnątrz CheckDetailEntries. W moim XML mam MenuItem, Condiment, MenuItem, Condiment. Ale kiedy XML jest konwertowany, grupuje [MenuItems] [0] i [MenuItems] [1], które następnie po dekodowaniu powoduje uporządkowanie MenuItem, MenuItem, Condiment, Condiment, co powoduje skojarzenie obu przypraw z ostatnim MenuItem. Zajrzę do SoapVar i SoapParam. Dzięki! – Fostah

+0

Czy byłoby możliwe wysłanie _soapCall z nazwą funkcji i zamiast wysyłać argumenty jako tablicę, czy mogę zamiast tego wysłać ciąg znaków XML? Nie mogę wymyślić, jak to zrobić. Dzięki! – Fostah

+0

@Fostah, ponieważ zaakceptowałeś odpowiedź, oczywiście pomógł Ci w debugowaniu/korekcie programu, ale czy mógłbyś napisać dokładnie, co było przyczyną nieprawidłowego XML? –