2016-08-14 3 views
1

Ich versuche, ein API Soapclient zu nennen, aber die Authentifizierung fehl, weil Namespace im XML-PHP reine XML in SOAP

Gestellten XML fehlt

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://tourico.com/webservices/" xmlns:trav="http://tourico.com/travelservices/"> 
    <soapenv:Header> 
     <web:LoginHeader> 
     <trav:username>*****</trav:username> 
     <trav:password>*******</trav:password> 
     <trav:culture>en_US</trav:culture> 
     <trav:version>7.123</trav:version> 
     </web:LoginHeader> 
    </soapenv:Header> 
    <soapenv:Body> 
     <web:CancelReservation> 
     <web:nResID>1235456</web:nResID> 
     </web:CancelReservation> 
    </soapenv:Body> 
</soapenv:Envelope> 

Was ich actualy sendet (keinen Namensraum in der LoginHeader)

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tourico.com/webservices/" xmlns:ns2="http://tourico.com/travelservices/"> 
    <SOAP-ENV:Header> 
     <ns2:LoginHeader> 
      <username>******</username> 
      <password>*******</password> 
      <culture>en_US</culture> 
      <version>8.0</version> 
     </ns2:LoginHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <ns1:CancelReservation> 
      <ns1:nResID>95665639</ns1:nResID> 
     </ns1:CancelReservation> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Mein PHP-Code

$url = "http://demo-wsnew.touricoholidays.com/ReservationsService.asmx?wsdl"; 

    $user = "*****"; 
    $pwd = "********"; 
    $culture = "en_US"; 
    $version = "8.0"; 

    $wsdl = $url;     

    $client = new SOAPClient($wsdl,array("trace" => true, "exceptions" => true, 'soap_version' => SOAP_1_1)); 

    $login = new stdClass(); 
    $login->usernam= $user; 
    $login->password = $pwd; 
    $login->culture = $culture; 
    $login->version = $version; 


    // Turn auth header into a SOAP Header 
    $header = new SoapHeader('http://tourico.com/travelservices', 'LoginHeader', $login, false); 

    // set the header 
    $client->__setSoapHeaders($header); 


    $r = new stdClass(); 
    $r->nResID = 123456; 

try 
{ 
    $res = $client->CancelReservation($r); 
    $results = json_decode(json_encode($res), true); 
    Log::error($client->__getLastRequest()); 
    Log::error(print_r($results , true)); 
} 
catch(Exception $e) 
{ 
    Log::error($client->__getLastRequest()); 
    Log::error($e->getMessage()); 
} 

Gibt es eine Möglichkeit, ich könnte einfach eine XML-Zeichenfolge an den SOAPclient senden?

Antwort

1

Sie haben einen abschließenden Schrägstrich im Namespace verpasst, was wahrscheinlich ein Teil des Problems war.

Dies ist ein Fall, in dem die Classmap-Funktion helfen könnte. Versuchen Sie diesen Code:

$url = "http://demo-wsnew.touricoholidays.com/ReservationsService.asmx?wsdl"; 

$user = "*****"; 
$pwd = "********"; 
$culture = "en_US"; 
$version = "8.0"; 

$wsdl = $url; 

class MyLoginHeader 
{ 
    public $username; 
    public $password; 
    public $culture; 
    public $version; 
} 

$classmap = array('LoginHeader' => 'MyLoginHeader'); 

$client = new SOAPClient($wsdl,array("classmap" => $classmap,"trace" => true, "exceptions" => true, 'soap_version' => SOAP_1_1)); 

$login = new MyLoginHeader(); 
$login->username = $user; 
$login->password = $pwd; 
$login->culture = $culture; 
$login->version = $version; 


// Turn auth header into a SOAP Header 
$header = new SoapHeader('http://tourico.com/travelservices/', 'LoginHeader', $login, false); 

// set the header 
$client->__setSoapHeaders($header); 


$r = new stdClass(); 
$r->nResID = 123456; 

try 
{ 
    $res = $client->CancelReservation($r); 
    $results = json_decode(json_encode($res), true); 
} 
catch(Exception $e) 
{ 
    var_dump($client->__getLastRequest()); 
    var_dump($e->getMessage()); 
} 

Der Code erzeugt eine XML-Anforderung, die wie folgt aussieht:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:ns1="http://tourico.com/webservices/" xmlns:ns2="http://tourico.com/travelservices/" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Header> 
     <ns2:LoginHeader xsi:type="ns2:LoginHeader"> 
      <ns2:username>*****</ns2:username> 
      <ns2:password>********</ns2:password> 
      <ns2:culture>en_US</ns2:culture> 
      <ns2:version>8.0</ns2:version> 
     </ns2:LoginHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <ns1:CancelReservation> 
      <ns1:nResID>123456</ns1:nResID> 
     </ns1:CancelReservation> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>