php

2011-12-28 4 views
9

में साबुन उपसर्ग बदलें, मैं .net से php तक एक साबुन वेब सेवा को फिर से लिख रहा हूं। डिफ़ॉल्ट रूप से, php मुझे टैग कि इस तरह दिखना दे रहा है:php

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"><SOAP-ENV:Header><ns1:FindAllCategories/></SOAP-ENV:Header><SOAP-ENV:Body><ns1:FindAllCategoriesResponse><ns1:FindAllCategoriesResult><ns1:ArtistCategoryDto> 

आदि ...

लेकिन मैं इस की जरूरत है:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><FindAllCategoriesResponse xmlns="http://tempuri.org/"><FindAllCategoriesResult><ArtistCategoryDto> 

यह सवाल यहां के समान है: PHP AND SOAP. Change envelope तथापि मैं इसे जिस तरह से किया है उसे हैक नहीं करना चाहता हूं। साथ ही, मैं एक साबुन सेवा बना रहा हूं जिसे एक मौजूदा आईफोन ऐप से उपभोग किया जाएगा, सोप क्लाइंट का उपयोग करके साबुन सेवा का उपभोग करने के लिए PHP का उपयोग नहीं किया जा रहा है। आईफोन ऐप सिर्फ कच्चे एक्सएमएल को पार्स करता है और मैं अभी आईफोन ऐप नहीं बदल सकता।

+1

क्या आप बता सकते हैं कि आपको विशेष रूप से अन्य समाधान के साथ क्या पसंद नहीं है? आप एक शॉर्टकमिंग कहां देखते हैं? इसके अलावा "मुझे बस काम करने की ज़रूरत है" इसे पूरा करना मुश्किल है, क्योंकि आईफोन ऐप में स्पष्ट रूप से कम कमी है। हो सकता है कि यह केवल एकमात्र नहीं है, तो अगर कोई अनुमान लगाए तो कोई आपके प्रश्न का उत्तर कैसे दे सकता है? – hakre

+0

ज़रूर। तो कुछ समस्याएं। सबसे पहले, मैं एक साबुन सेवा का निर्माण कर रहा हूं, और उदाहरण एक साबुन ग्राहक का उपयोग कर रहा है। मैं एक php साबुन क्लाइंट का उपयोग नहीं कर रहा हूं - ऐप क्लाइंट है। दूसरा, मुझे xml को हैक करने के लिए RegEx का उपयोग करना पसंद नहीं है।मैं इसे कुछ मूल एपीआई के साथ करता हूं, या यदि आवश्यक हो, तो नामस्थानों को पार्स करने के लिए एक एक्सएमएल पार्सर का उपयोग करके, लेकिन मुझे नहीं पता कि एक्सएमएल को पार्स करने के लिए प्रतिक्रिया को कैसे पकड़ना है। ऐप निश्चित रूप से एक कमी है, क्योंकि इसका उद्देश्य साबुन का उपयोग नहीं कर रहा था। लेकिन जिस तरह से यह बनाया गया था क्योंकि उस समय कोई अच्छा साबुन पार्सर्स नहीं थे। – fregas

उत्तर

5

फिर से पढ़ने कि यह क्या है आप चाहते हैं और यहाँ php प्रलेखन के माध्यम से खोज करने के बाद मेरी समाधान और है कि मैं

अनुमान

  • तो मैं मान्यताओं की एक जोड़ी है एम सही आप जानते हैं कि एसओएपी उपसर्ग स्वयं मुद्दा नहीं है (जब तक यह सुसंगत है तब तक आपको किसी भी उपसर्ग का उपयोग करने की अनुमति है)।
  • हम आपको अपग्रेड एक (xml) पार्सर के उपयोग है कि वर्तमान में बदला नहीं जा सकता/बनाता है इस विशिष्ट iPhone App के लिए चारों ओर काम एक बनाने की जरूरत

तुम क्या चाहते हो?

  1. से पहले ही वापस आ जा रही है

समाधान आप एक देशी एपीआई का उपयोग करने सोप उपसर्ग

  • आप SoapServer प्रतिक्रिया को पकड़ने के लिए चाहते हैं बदलने के लिए ताकि आप सोप उपसर्ग बदल सकते हैं चाहते हैं

    1. इस समय वहाँ सोप उपसर्ग को बदलने के लिए कोई मूल SoapServer एपीआई विधि है
    2. +०१२३५१६४१०६
    3. आप SoapServer प्रतिक्रिया को पकड़ने और या तो regex या XML पार्सर प्रतिक्रिया संसाधित कर सकते हैं नीचे
    <?php 
    
    // Create you parse function - Regex 
    function SoapServerRegexParser($input) 
    { 
        // $input contains your XML Response 
        // Do str_replace or preg_replace 
        $request = preg_replace({do replace}); 
    
        //return modified output to client 
        return $request; 
    } 
    
    // OR create you parse function - Regex XML Parser 
    function SoapServerXMLParser($input) 
    { 
        // $input contains your XML Response 
        // Use any xml parser that you would like 
        $xml = new DOMDocument(); 
        $xml->formatOutput = true; 
        $xml->preserveWhiteSpace = false; 
        $xml->loadXML($input); 
        //Do replacement have a looke at: DOMNode::replaceChild 
    
        //return modified output to client 
        return $xml->saveXML(); 
    } 
    
    // Make php buffer all output 
    // Send all output to a callBack function 
    
    // Replace 'SoapServerRegexParser' with the callback function name of choice 
    ob_start('SoapServerRegexParser'); //buffer output and set callback function 
    
    // Create SoapServer 
    $server = new SoapServer('wsdlfile.wsdl'); 
    $server->handle(); //Handle incoming request 
    ob_end_flush(); //Release buffer, but send through callback function first 
    
    ?> 
    

    इस उदाहरण को देखने के चाल करना चाहिए, मैं regex हिस्सा या वास्तविक xlm नोड प्रतिस्थापन नहीं बनाया है लेकिन मुझे लगता है कि आप इसे स्वयं कर सकते हैं

  • +0

    असल में, मुझे नामस्थान उपसर्गों को बहुत विशिष्ट होने की आवश्यकता है। आईफोन ऐप उनकी तलाश में है। हालांकि, अगर मैं यहां बफर में आउटपुट बदल सकता हूं, तो मुझे लगता है कि मैं अच्छा हूं। तो इसके बजाय: ob_start ('SoapServerRegexParser'); मैं उपयोग करूंगा: साबुन सर्वर एक्सएमएलपार्स '); ... अगर मैं xml का उपयोग करके इसे पार्स करना चाहता हूं? – fregas

    +0

    हां यह सही है। एक बच्चे नोड को प्रतिस्थापित करने के तरीके पर http://nl2.php.net/manual/en/domnode.replacechild.php पर एक नज़र डालें। यदि आप जिस स्ट्रिंग को खोज रहे हैं, और आप उन्हें बदलना चाहते हैं, तो मुझे लगता है कि str_replace –

    +0

    का उपयोग करना बहुत आसान है - बस एक लचीली साबुन सर्वर को तुरंत लिखने के लिए मुझे जो चाहिए था। – Olaf

    0

    यदि आप नियमित अभिव्यक्तियों का उपयोग नहीं करना चाहते हैं, तो मैंने यह त्वरित कक्षा कार्यान्वयन किया है जो एक्सएमएल को साफ करने और नोड स्तर पर नेमस्पेस विशेषता को जोड़ने के लिए डोमक्सपाथ और डोम डॉक्यूमेंट का उपयोग करता है।

    <?php 
    
    public BetterSoapClient extends SoapClient { 
    
        public function __construct($wsdl, $options = null) { 
         parent::__construct($wsdl, $options); 
        } 
    
        public function __doRequest($request, $location, $action, $version) { 
    
         $dom = new DOMDocument('1.0'); 
    
         // loads the SOAP request to the Document 
         $dom->loadXML($request); 
    
         // Create a XPath object 
         $path = new DOMXPath($dom); 
    
         // Search the nodes to fix 
         $nodesToFix = $path->query('//SOAP-ENV:Envelope/SOAP-ENV:Body/*', null, true); 
    
         // Remove unwanted namespaces 
         $this->fixNamespace($nodesToFix, 'ns1', 'http://tempuri.org/'); 
    
         // Save the modified SOAP request 
         $request = $dom->saveXML(); 
    
         return parent::__doRequest($request, $location, $action, $version); 
        } 
    
        public function fixNamespace(DOMNodeList $nodes, $namespace, $value) { 
         // Remove namespace from envelope 
         $nodes->item(0) 
           ->ownerDocument 
           ->firstChild 
           ->removeAttributeNS($value, $namespace); 
    
         //iterate through the node list and remove namespace 
    
         foreach ($nodes as $node) { 
    
          $nodeName = str_replace($namespace . ':', '', $node->nodeName); 
          $newNode = $node->ownerDocument->createElement($nodeName); 
    
          // Append namespace at the node level 
          $newNode->setAttribute('xmlns', $value); 
    
          // And replace former node 
          $node->parentNode->replaceChild($newNode, $node); 
         } 
        } 
    } 
    
    +0

    यह मेरी मदद नहीं करता है। मैं सोपसेवर का उपयोग करके एक साबुन वेब सेवा का निर्माण कर रहा हूं, सोप क्लाइंट का उपयोग करके दूसरी सेवा नहीं ले रहा हूं। मैंने इसे और अधिक स्पष्ट करने के लिए मूल पोस्ट को संशोधित किया है, हालांकि मैंने मूल रूप से इसका उल्लेख किया था और टिप्पणियों में भी। – fregas

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