2012-03-07 15 views
5

Estoy intentando simplemente enviar RAW xml a un servicio web a través de PHP y SoapClient. El problema es que cuando codigo mi XML, cambia el orden de los elementos en el XML que se convierte a una matriz asociativa.Envío de XML sin formato a través de PHP Petición de SoapClient

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

Cómo o cuál sería la mejor manera de enviar el siguiente código XML como una cadena a mi 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> 

actualización/Resolución: Aquí está el código que utiliza para extender el cliente SOAP y enviar mi sobre SOAP prima: My answer below

+0

Estoy confundido: ¿está enviando ese XML al servicio SOAP y no está siendo analizado o tiene XML que desea enviar dentro del mensaje SOAP? – enygma

+0

Tengo XML Deseo enviar el mensaje de error. Cuando envío los datos codificados en una matriz asociativa, los nodos pierden su orden original que rompe la solicitud. Un ejemplo: dentro de CheckDetailEntries puede tener etiquetas MenuItem o Condiment. Pero para asociar condimentos a MenuItems deben estar en un cierto orden que se pierde cuando codigo el XML. Así que solo necesito enviar cadenas XML al método PostTransaction para procesarlas. – Fostah

+0

¿Hay alguna otra forma de asociarlos? Confiar en el orden del XML entrante me parece un poco frágil ... – enygma

Respuesta

7

actualización/Resolución: Aquí está el código que utiliza para extender el cliente SOAP y enviar mi prima SOAP

Así es como me ampliado 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); 
?> 

también publicado en pastie.org: http://pastie.org/3687935 antes de cumplir esto en la respuesta.

+4

¿Acaba de pasar su cadena XML como $ orderRequest? – fibono

4

Para propósitos de prueba, puede subclase SoapClient y anula el método __doRequest: recibe el XML generado y puede preprocesarlo.

Pero es mejor que encuentre lo que está mal con la codificación XML. Puede usar instancias de SoapVar y SoapParam para especificar la forma exacta en que se debe representar el objeto dado. Aquellos salvado la vida cuando los espacios de nombres tenían que estar dadas

+0

Lo que sucede es que cuando mi XML se codifica en una matriz asociativa, pierde el orden de los elementos dentro de CheckDetailEntries. En mi XML tengo MenuItem, Condiment, MenuItem, Condiment. Pero cuando el XML se convierte, agrupa [MenuItems] [0] y [MenuItems] [1] que luego, cuando se descodifica, crea el orden MenuItem, MenuItem, Condiment, Condiment que hace que ambos condimentos se asocien con el último MenuItem. Buscaré en SoapVar y SoapParam. ¡Gracias! – Fostah

+0

¿Sería posible enviar _soapCall con el nombre de la función y en lugar de enviar argumentos como una matriz, ¿puedo enviarle una cadena XML en su lugar? No puedo entender cómo hacerlo. ¡Gracias! – Fostah

+0

@Fostah como has aceptado responder, obviamente, te ayudó a depurar/corregir el programa, pero ¿te importaría publicar exactamente cuál fue la causa del XML incorrecto? –

Cuestiones relacionadas