2017-06-23 14 views
6

के लिए कॉम्प्लेक्स हेडर मुझे अलग-अलग नामस्थान और प्रकारों के साथ मेरे सोप क्लाइंट हेडर में निम्न जटिल शीर्षलेख जोड़ने की आवश्यकता है।PHP सोप क्लाइंट

<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> 
    <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:UsernameToken> 
      <wsse:Username>****</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">*****</wsse:Password> 
     </wsse:UsernameToken> 
    </wsse:Security> 
    <wsa:Action>/IntS5/S5WS</wsa:Action> 
</soapenv:Header> 

अन्य उत्तर में प्रस्तावित के रूप में मैं अपने php project.Since में निम्नलिखित दृष्टिकोण मैं डब्ल्यूएसए को संबोधित करते जरूरत की कोशिश की, मैं wsa सेट: सुरक्षा हेडर के साथ लड़ाई एक साथ।

$header_part = '<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">' 
     . '<wsse:UsernameToken><wsse:Username>****</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">****</wsse:Password>' 
     . '</wsse:UsernameToken></wsse:Security><wsa:Action>/IntS5/S5WS</wsa:Action>'; 

    $soap_var_header = new SoapVar($header_part, XSD_ANYXML, null, null, null); 
    $soap_header = new SOAPHeader('http://www.w3.org/2005/08/addressing', 'wsa', $soap_var_header); 
    $client->__setSoapHeaders($soap_header); 

कुछ कैसे __soapCall मुझे निम्न त्रुटि देता है।

सोपफॉल्ट अपवाद: [क्लाइंट] डीटीडी SOAP द्वारा समर्थित नहीं है। मुझे यकीन नहीं है कि यह हेडर से संबंधित है या putCall के पैरामीटर से संबंधित है। कोई मेरी मदद कर सकता है?

संपादित करें: समस्या शायद हेडर/लिफाफा के नामस्थान से संबंधित है।

सर्वर पर भेजा गया अनुरोध इस तरह दिखता है।

<?xml version="1.0" encoding="UTF-8"?> 
        <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://ws.s5.mediasat.de/" xmlns:ns2="http://www.w3.org/2005/08/addressing"> 
         <env:Header> 
          <wsse:Security env:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
           <wsse:UsernameToken> 
            <wsse:Username>****</wsse:Username> 
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">*****</wsse:Password> 
           </wsse:UsernameToken> 
          </wsse:Security> 
          <wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">/IntS5/S5WS</wsa:Action> 
         </env:Header> 
         <env:Body> 
          <ns1:putCall> 
           <transaction>createIncident</transaction> 
           <transactionSender>Request</transactionSender> 
           <caseDataModel> 
            <senderId>7</senderId> 
            <ticketTypeId>102</ticketTypeId> 
            <title>test</title> 
            <priorityId>101</priorityId> 
            <categoryId>128</categoryId> 
            <description>Description</description> 
            <ticketNumberSender>INCC00000743809</ticketNumberSender> 
            <createTypeId>701</createTypeId> 
            <serviceId>B001APP05K</serviceId> 
            <categoryId>128</categoryId> 
            <serviceRecipientId>77888</serviceRecipientId> 
            <serviceLocationSAPCode>V135</serviceLocationSAPCode> 
           </caseDataModel> 
          </ns1:putCall> 
         </env:Body> 
        </env:Envelope> 

अनुरोध है कि सोप यूआई

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.s5.mediasat.de/"> 
    <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> 
     <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
      <wsse:UsernameToken> 
       <wsse:Username>***</wsse:Username> 
       <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">***</wsse:Password> 
      </wsse:UsernameToken> 
     </wsse:Security> 
     <wsa:Action>/IntS5/S5WS</wsa:Action> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ws:putCall> 
      <transaction>createIncident</transaction> 
      <transactionSender>Request</transactionSender> 
      <caseDataModel> 
       <senderId>7</senderId> 
       <ticketTypeId>102</ticketTypeId> 
       <title>test</title> 
       <priorityId>101</priorityId> 
       <categoryId>128</categoryId> 
       <description>Description</description> 
       <ticketNumberSender>INCC00000743809</ticketNumberSender> 
       <createTypeId>701</createTypeId> 
       <serviceId>B001APP05K</serviceId> 
       <categoryId>128</categoryId> 
       <serviceRecipientId>77888</serviceRecipientId> 
       <serviceLocationSAPCode>V135</serviceLocationSAPCode> 
      </caseDataModel> 
     </ws:putCall> 
    </soapenv:Body> 
</soapenv:Envelope> 

पर काम करता है सेट/हेडर के लिए नाम स्थान ओवरराइड करने के लिए वहाँ वैसे भी है UPDATED?

+0

Y0ou/डंपिंग अनुरेखण द्वारा त्रुटि इंगित करने के लिए सक्षम होना चाहिए। – mikep

+0

$ ग्राहक = नया \ SoapClient (dirname (__ FILE__)।DIRECTORY_SEPARATOR। $ url, सरणी ('अपवाद' => सत्य, 'ट्रेस' => सत्य)); ट्रेसिंग पहले से ही सक्षम है। –

+0

@mikep यह शिकायत है कि प्रतिक्रिया लौटा एक वैध एक्सएमएल पेज नहीं है। मैंने साबुन में जेनरेट किए गए अनुरोध की कोशिश की। मुझे जड़ तत्व से संबंधित जावा अपवाद मिलता है। –

उत्तर

2

आपको स्ट्रिंग का उपयोग करने के बजाय प्रक्रियात्मक रूप से शीर्षलेख उत्पन्न करना चाहिए।

उदाहरण:

<?php 

$client = new SoapClient(null, array(
    'location' => "http://localhost/soap/", 
    'uri' => "http://ws.s5.mediasat.de/", 
    'soap_version' => SOAP_1_2 
)); 

$username = '***'; 
$password = '***'; 
$sec_namespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; 
$wsa_namespace = 'http://www.w3.org/2005/08/addressing'; 

// prepare security token 
$node1 = new \SoapVar($username, XSD_STRING, null, null, 'Username', $sec_namespace); 

$xml = new XMLWriter(); // this is a little hacky, but no other way to set the type as far as I know 
$xml->openMemory(); 
$xml->startElementNS('wsse', 'Password',$sec_namespace); 
$xml->writeAttribute('Type', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'); 
$xml->Text($password); 
$xml->endElement(); 
$node2 = new \SoapVar($xml->outputMemory(), XSD_ANYXML); 

$token = new \SoapVar(array($node1, $node2), SOAP_ENC_OBJECT, null, null, 'UsernameToken', $sec_namespace); 
$security = new \SoapVar(array($token), SOAP_ENC_OBJECT, null, null, 'Security', $sec_namespace); 
$soap_header_sec = new \SOAPHeader($sec_namespace, 'Security', $security, true); 

// prepare action token 
$action = new \SoapVar('/IntS5/S5WS', XSD_STRING, null, null, 'Action', $wsa_namespace); 
$soap_header_action = new \SOAPHeader($wsa_namespace, 'Action', $action, false); 

// set prepared headers 
$client->__setSoapHeaders(
    [$soap_header_sec,$soap_header_action] 
); 

$client->putCall(); 

यह सब नामस्थान सेट के साथ वैध लिफाफा उत्पादन करेगा:

<?xml version="1.0" encoding="utf-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://ws.s5.mediasat.de/" xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns3="http://www.w3.org/2005/08/addressing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2003/05/soap-encoding"> 
    <env:Header> 
    <ns2:Security env:mustUnderstand="true"> 
     <ns2:UsernameToken> 
     <ns2:Username>***</ns2:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">***</wsse:Password> 
     </ns2:UsernameToken> 
    </ns2:Security> 
    <ns3:Action>/IntS5/S5WS</ns3:Action> 
    </env:Header> 
    <env:Body> 
    <ns1:putCall env:encodingStyle="http://www.w3.org/2003/05/soap-encoding" /> 
    </env:Body> 
</env:Envelope> 
+0

बीटीडब्ल्यू यह $ xml-> startElementNS ('ns2', 'पासवर्ड', $ sec_namespace) होना चाहिए; –

+0

समस्या xmlns है: env = "http://www.w3.org/2003/05/soap-envelope" अगर मैं इसे "http://schemas.xmlsoap.org/soap/envelope/" में बदल सकता हूं नया जेनरेट अनुरोध अनुरोध करता है। क्या यह किसी भी तरह से संभव है? –

+0

@IlkerBaltaci सोचता है कि एसओएपी 1.1 है, बस 'साबुन_वर्जन' => SOAP_1_2' में SOAP_1_1 – luki

0
  1. नाम स्थान "http://www.w3.org/2005/08/addressing" उपसर्ग "wsa" से बाध्य नहीं है।

  2. "mustUnderstand" विशेषता उपसर्ग "env" नहीं "soapenv" उपयोग करना चाहिए।

आप लापता नामस्थान स्थानीय रूप से घोषित कर सकते हैं। तुम बस आप header_part ठीक करने के लिए इस तरह दिखना चाहिए:

header_part = '<wsse:Security env:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">' 
    . '<wsse:UsernameToken><wsse:Username>****</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">****</wsse:Password>' 
    . '</wsse:UsernameToken></wsse:Security><wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">/IntS5/S5WS</wsa:Action>'; 

नोट: हो सकता है कि यह स्पष्ट है, लेकिन यह खतरनाक तरह का ग्रहण करने के लिए है कि "http://www.w3.org/2003/05/soap-envelope" हमेशा हो जाएगा "env के लिए" उपसर्ग। ढांचा किसी भी समय इसे बदल सकता है। क्या तुम सच में सुरक्षित पक्ष पर होना चाहते हैं तो आप एक नया उपसर्ग के लिए स्थानीय स्तर पर नाम स्थान बाध्य करने के लिए पसंद कर सकते हैं:

<wsse:Security soapenv:mustUnderstand="1" xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" ... 

लेकिन एक नाम स्थान में दो अलग अलग उपसर्गों के लिए बाध्य कर बातें और भी कठिन कर देगा होने पढ़ सकते हैं और मैं बहुत समझने के लिए कहेंगे कि यह स्वाद का सवाल है।

+0

सवाल यह है कि xmlns कैसे जोड़ें: wsa = "http://www.w3.org/2005/08/addressing" साबुन में हेडर में –

+0

मैंने बदल दिया हेडर जैसा आपने प्रस्तावित किया है लेकिन सर्वर मुझे भेजता है "ऐसा लगता है कि हमें कोई XML दस्तावेज़ नहीं मिला"। मैंने पूरे अनुरोध निकाय की प्रतिलिपि बनाई और SOAP UI पर चिपकाया। यह मुझे वापस लौटाता है "अनुरोध लागू करने के लिए नीति प्रवर्तन विफल रहा।" चूंकि सुरक्षा हेडर पहचाना नहीं गया है। –

+0

क्या आप जेनरेट किए गए पूर्ण अनुरोध को पोस्ट कर सकते हैं। – fhossfel

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