2013-01-16 13 views
6

मैं php के साथ SOAP में एक webservice के साथ संचार कर रहा हूं। यहाँ मेरी कोड है: किसी कारण सेPHP सोप क्लाइंट विकृत xml

$data = array('name' => 'test', 'age' => 20); 
$WDSL = 'http://xxx.xxxxx.xxx/wdsl.ibs?wsdl'; 
$SOAP = new SoapClient($WDSL, array('trace' => true)); 
$RESULT = $SOAP->__soapCall('Some_Service', $data); 

, एक्सएमएल गलत है:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Some_Crap"><SOAP-ENV:Body><ns1:Some_Service/><param1>test</param1><param2>20</param2> ... 

कैसे आ एक्सएमएल नोड नाम paramX जब यह चर नाम होना चाहिए? मैं क्या गलत कर रहा हूं ??

धन्यवाद

अद्यतन: तो मुझे लगता है कि वेब सेवा से कार्यों को सूचीबद्ध किया है और मैं क्या मिलता है:

Some_Service_Response Some_Service(Some_Service $parameters)) 

मैं अपने कॉल बदल तो यह अब है:

$SOAP->__call('Some_Service', array('Some_Service', $data)); 

और एक्सएमएल अभी भी गलत है:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV=" 
http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="urn:iwaysoftware:ibse:jul2003:HR_Master"><SOAP-ENV:Body><ns1:Some_Service/> 
<param1><item><key>SomeKey</key><value>SomeValue</value> .... 

मुझे अभी भी <param1><item><key>SomeKey</key><value>SomeValue</value> instead of <Somekey>SomeValue</Somekey>

तो सवाल यह है कि वेब सेवा ठीक से काम नहीं कर रही है या यह मेरे अंत में है?

उत्तर

4

यदि मैं आप थे तो मैं ऑब्जेक्ट प्रारूप में $ डेटा सेट अप करने का प्रयास करूंगा।

$data = array('name' => 'test', 'age' => 20); 

उदाहरण के लिए:

$data = null; 
$data->name = "test"; 
$data->age = 20; 

$RESULT = $SOAP->__soapCall('Some_Service', $data); 
+0

यह पहले से ही मामला है – Eric

+0

@Eric प्रश्न में '$ डेटा' एक सरणी है, न कि ऑब्जेक्ट। –

+0

ओह क्षमा करें, हाँ आप सही हैं :) – Eric

7

SoapClient कक्षा सेवा के डब्लूएसडीएल के आधार पर कई सुधार करता है, उदाहरण के लिए अमान्य टैग हटा देता है। डब्लूएसडीएल की जांच करें, इसमें यह हो सकता है कि पैरामीटर का नाम param1 और param2 है।

SoapClient::__getFunctions() और SoapClient::__getTypes() पर कॉल करके और परिणामों को डंप करने से आपके डब्लूएसडीएल से पीएचपी को समझने में काफी अच्छा सारांश मिलता है।


(के बाद ओपी SoapClient::__getFunctions() के उत्पादन के उस सवाल का अद्यतन है:

Some_Service_Response Some_Service(Some_Service $parameters)) 

)

आमतौर पर सरणी कुंजी पैरामीटर नाम, नहीं प्रकार है। तो मेरा पहला अनुमान होगा:

$SOAP->__call('Some_Service', array('parameters', $data)); 

समस्या सर्वर-पक्ष पर हो सकती है। डब्ल्यूएसडीएल असंगतताओं को कभी-कभी डब्ल्यूएसडीएल फाइलों के हाथ-ट्यूनिंग की आवश्यकता होती है ताकि PHP उसी एक्सएमएल को उत्सर्जित कर सके जो आप चाहते हैं।

लेकिन किसी भी हैकिंग (यदि आपके पास मौका है) करने से पहले अलग-अलग एक्सएमएल फाइलों की सेवा की प्रतिक्रिया देखने के लिए PHP के बिना सेवा को आजमाएं। SoapUI नामक एक अच्छा कार्यक्रम यह आपके लिए कर सकता है, यह स्वचालित रूप से परीक्षण करने के लिए एक्सएमएल स्टब्स उत्पन्न करता है। (मुझे केवल सोपूआई के साथ वेब सेवाओं के साथ समस्याएं थीं जिनके लिए डिजिटल हस्ताक्षर की आवश्यकता थी।)

एक्सएमएल के परिणामों के आधार परीक्षण आप की आवश्यकता हो सकती:

  • हाथ से धुन डबल्यूएसडीएल
  • हाथ से एक्सएमएल फ़ाइल उत्पन्न और वेब सर्वर से भेजने (अंतिम उपाय)
  • यदि एक्सएमएल लगभग सही है, तो उसे केवल एक छोटे से ठीक ट्यूनिंग की आवश्यकता होती है जिसे आप SoapClient कक्षा से प्राप्त कर सकते हैं और सर्वर पर सबमिट करने से पहले XML फ़ाइल पर स्ट्रिंग मैनिप्लेशंस करने के लिए SoapClient::__doRequest विधि को ओवरराइड कर सकते हैं (आधार के __dorequest को कॉल करके कक्षा)। एक उदाहरण, जब मैंने इस समाधान का उपयोग किया, जब वेब सेवा को कुछ टैग्स पर कुछ एक्सएमएल विशेषताओं की आवश्यकता होती है।
+0

नहीं, वहाँ डबल्यूएसडीएल में ऐसी कोई बात नहीं है .. – Eric

+0

यहाँ मैं क्या मिलता है: सरणी ([0] => struct ibsinfo {स्ट्रिंग सेवा; स्ट्रिंग विधि; स्ट्रिंग लाइसेंस; स्ट्रिंग स्वभाव; स्ट्रिंग उपयोगकर्ता नाम; स्ट्रिंग पासवर्ड; स्ट्रिंग भाषा;} [1] => संरचना adapterexception {स्ट्रिंग त्रुटि;} [2] => संरचना कुछ_Service {Some_Service_Complex टाइप करें hr_master;} [3] => संरचना Some_Service_Complex टाइप { WS_Transaction_ID WS_Transaction_ID; Web_Service_Request_Type ... – Eric

+1

कृपया इसे प्रश्न में रखें b पारिस्थितिकी (ए) यह वहां है (बी) टिप्पणियों में पठनीयता में सुधार करने के लिए नई लाइनें नहीं हो सकती हैं (सी) टिप्पणियों की सीमित लंबाई है और दिलचस्प विवरण – Csq

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