2012-03-07 20 views
5

के माध्यम से कच्चे एक्सएमएल भेजना मैं PHP और सोप क्लाइंट के माध्यम से एक webservice को रॉ एक्सएमएल भेजने की कोशिश कर रहा हूं। समस्या यह है कि जब मैं अपने एक्सएमएल को एन्कोड करता हूं तो यह एक्सएमएल में तत्वों का क्रम बदलता है जो एक एसोसिएटिव सरणी में परिवर्तित हो जाता है।PHP सोप क्लाइंट अनुरोध

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

मेरे सोप क्लाइंट को स्ट्रिंग के रूप में निम्न XML को भेजने का सबसे अच्छा तरीका कैसा होगा या कैसे होगा?

<?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> 

अपडेट/समाधान: यहाँ कोड मैं सोप ग्राहक का विस्तार और मेरे कच्चे साबुन लिफाफा भेजने के लिए प्रयोग किया जाता है: My answer below

+0

मैं उलझन में हूं - क्या आप उस एक्सएमएल को एसओएपी सेवा में भेज रहे हैं और इसे पार्स नहीं किया जा रहा है या आपके पास एक्सएमएल है जिसे आप एसओएपी संदेश के अंदर भेजना चाहते हैं? – enygma

+0

मेरे पास एक्सएमएल है जो मैं साबुन संदेश में भेजना चाहता हूं। जब मैं किसी एसोसिएटिव सरणी में एन्कोड किए गए डेटा भेजता हूं, तो नोड्स ने अपना मूल ऑर्डर खोला जो अनुरोध को तोड़ देता है। एक उदाहरण: CheckDetailEntries के अंदर आप MenuItem या Condiment टैग्स प्राप्त कर सकते हैं। लेकिन म्यूज़ियम में मसालों को जोड़ने के लिए उन्हें एक निश्चित क्रम में होना चाहिए जो एक्सएमएल को एन्कोड करते समय खो जाता है। इसलिए मुझे प्रक्रिया के लिए PostTransaction विधि में XML स्ट्रिंग भेजने की आवश्यकता है। – Fostah

+0

क्या कोई और तरीका है जिससे आप उन्हें जोड़ सकते हैं? आने वाले एक्सएमएल के आदेश पर निर्भर मेरे लिए थोड़ा नाजुक लगता है ... – enygma

उत्तर

7

अपडेट/संकल्प था: यहाँ कोड मैं सोप ग्राहक का विस्तार और मेरे कच्चे साबुन लिफाफा भेजने के लिए प्रयोग किया जाता है

यहाँ मैं कैसे बढ़ाया है 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

क्या आपने अपनी एक्सएमएल स्ट्रिंग को $ orderRequest के रूप में पास किया था? – fibono

4

परीक्षण प्रयोजनों के लिए, आप कर सकते हैं उपवर्ग SoapClient और __doRequest विधि को ओवरराइड करें - यह जेनरेट एक्सएमएल प्राप्त करता है और आप इसे प्री-प्रोसेस कर सकते हैं।

लेकिन बेहतर लगता है कि एक्सएमएल एन्कोडिंग के साथ क्या गलत हो रहा है। आप सोपवार और सोपपाराम उदाहरणों का उपयोग कर सकते हैं ताकि ऑब्जेक्ट को सटीक तरीके से प्रदर्शित किया जा सके। उन मेरी जान बचाई जब नामस्थान

दिए जाने की
+0

क्या हो रहा है जब मेरा एक्सएमएल एक एसोसिएटिव सरणी में एन्कोड किया जा रहा है, तो यह CheckDetailEntries के अंदर तत्वों का ऑर्डर खो देता है। मेरे एक्सएमएल में मेरे पास मेनूइटम, मसाला, मेनू इटैम, मसाला है। लेकिन जब एक्सएमएल परिवर्तित हो जाता है, तो यह [menuItems] [0] और [menuItems] [1] को समूहित करता है, जो तब डीकोड किए जाने पर ऑर्डर मेनूइटम, मेनूइटम, मसाला, मसाला बनाता है जो दोनों मसालों को अंतिम मेनू इटैम से जोड़ता है। मैं सोपवार और सोपपाराम में देखूंगा। धन्यवाद! – Fostah

+0

क्या फ़ंक्शन नाम के साथ _soapCall भेजना संभव है और सरणी के रूप में तर्क भेजने की बजाय मैं इसे एक एक्सएमएल स्ट्रिंग भेज सकता हूं? मैं यह नहीं समझ सकता कि इसे कैसे किया जाए। धन्यवाद! – Fostah

+0

@Fostah जैसा कि आपने स्पष्ट रूप से उत्तर स्वीकार कर लिया है, इसने आपको प्रोग्राम को डीबग/सही करने में मदद की है, लेकिन क्या आप गलत एक्सएमएल का कारण क्या पोस्ट करना चाहते हैं? –

संबंधित मुद्दे