2016-04-25 12 views
0

Ich versuche, einen SOAP-Aufruf mit dem SoapClient in PHP zu machen, aber ich habe Probleme beim Senden der Körperparameter. Die Header werden gerade gesendet und es gibt keine Fehler, aber der Body ist leer.PHP SoapClient Body Parameter werden nicht gesendet

Ich bin nicht mit PHP so vertraut, das ist neu für mich.

Hier ist meine Login-Funktion:

function Login($username, $password, $clientaccesskey, $useraccesskey) 
{ 
    $parameters = array(
        'LogOnRequest' => 
          array(
           'ClientAccessKey' => $clientaccesskey, 
           'Password' => $password, 
           'UserAccessKey' => $useraccesskey, 
           'UserName' => $username 
           ) 
        ); 

    $headers = array(); 

    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', 'http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn'); 
    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', 'https://service4.ultipro.com/services/BiDataService'); 

    try 
    { 
     $soapclient = new SoapClient('https://service4.ultipro.com/services/BiDataService', array('soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'exceptions' => TRUE, 'trace' => TRUE)); 
     $soapclient->__setSoapHeaders($headers); 
     $response = $soapclient->__soapCall('LogOn', array($parameters)); 

     echo json_encode($response); 

     echo htmlentities($soapclient->__getLastRequest()); 
    } 
    catch(SoapFault $fault){ 
     echo $fault->faultstring; 
    } 

} 

Wenn ich diesen Code ausführen es auf dem Server zu sprechen scheint, weil ich eine Antwort bin immer:

{"LogOnResult":{"ServiceId":null,"ClientAccessKey":null,"Token":null,"Status":"Failed","StatusMessage":"User authentication failed","InstanceKey":null}} 

Aber das ist der XML-Code,

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.ultipro.com/dataservices/bidata/2" xmlns:ns2="http://www.w3.org/2005/08/addressing"> 
    <env:Header> 
     <ns2:Action>http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn</ns2:Action> 
     <ns2:To>https://service4.ultipro.com/services/BiDataService</ns2:To> 
    </env:Header> 
    <env:Body> 
     <ns1:LogOn /> 
    </env:Body> 
</env:Envelope> 

Dies ist, was die XML aussehen soll : an den Dienst gesendet wird

<?xml version="1.0" encoding="UTF-8"?> 
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn</a:Action> 
     <a:To s:mustUnderstand="1">https://servicehost/services/BiDataService</a:To> 
    </s:Header> 
    <s:Body> 
     <LogOn xmlns="http://www.ultipro.com/dataservices/bidata/2"> 
     <logOnRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <UserName>username</UserName> 
      <Password>password</Password> 
      <ClientAccessKey>12345</ClientAccessKey> 
      <UserAccessKey></UserAccessKey> 
     </logOnRequest> 
     </LogOn> 
    </s:Body> 
</s:Envelope> 

Was mache ich falsch, dass die Body-Parameter nicht in der SOAP-Anfrage gesendet werden?

Antwort

2

Ich konnte es erreichen, eine Klasse verwenden, die SOAPVar und die SOAPParam Klassen, wie folgt aus:

function Login($username, $password, $clientaccesskey, $useraccesskey) 
{ 
    // Class handler for the request 
    class LogOnRequest { 
     function __construct($usr, $pwd, $cak, $uak) 
     { 
      $this->UserName = $usr; 
      $this->Password = $pwd; 
      $this->ClientAccessKey = $cak; 
      $this->UserAccessKey = $uak; 
     } 
    } 

    // Conversion to a SOAP object 
    $lor = new LogOnRequest($username, $password, $clientaccesskey, $useraccesskey); 
    $logOnRequest = new SoapVar($lor, SOAP_ENC_OBJECT, 'LogOnRequest', 'http://soapinterop.org/xsd'); 

    $headers = array(); 
    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', 'http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn'); 
    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', 'https://service4.ultipro.com/services/BiDataService'); 

    try 
    { 
     $soapclient = new SoapClient('https://service4.ultipro.com/services/BiDataService', array('soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'exceptions' => TRUE, 'trace' => TRUE)); 
     $soapclient->__setSoapHeaders($headers); 

     // Direct call to the LogOn method and SOAP parameter pass 
     $response = $soapclient->LogOn(new SoapParam($logOnRequest, 'logOnRequest')); 

     echo json_encode($response); 

     echo htmlentities($soapclient->__getLastRequest()); 
    } 
    catch(SoapFault $fault){ 
     echo $fault->faultstring; 
    } 

} 

die mir die folgende XML-Anfrage gab:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://soapinterop.org/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.ultipro.com/dataservices/bidata/2" xmlns:ns3="http://www.w3.org/2005/08/addressing"> 
    <env:Header> 
     <ns3:Action>http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn</ns3:Action> 
     <ns3:To>https://service4.ultipro.com/services/BiDataService</ns3:To> 
    </env:Header> 
    <env:Body> 
     <ns2:LogOn xsi:type="ns1:LogOnRequest"> 
      <UserName>u</UserName> 
      <Password>p</Password> 
      <ClientAccessKey>cak</ClientAccessKey> 
      <UserAccessKey>uak</UserAccessKey> 
     </ns2:LogOn> 
    </env:Body> 
</env:Envelope> 
+0

Danke für die Hilfe. Ich kann mich immer noch nicht mit dem Webservice einloggen. Das einzige, worüber ich mir nicht sicher bin, ist das " 'Muss das weiter verschachtelt werden oder denken Sie, was Sie ausgeben sollten? – user3788671

+0

Ich denke es sollte funktionieren, aber Sie fragen besser den Besitzer der Seife Service zu sehen, wie Yoy sollte die Daten senden. –

+0

Okay, danke! – user3788671