2016-08-14 4 views
1

Я пытаюсь вызвать API с помощью SoapClient но аутентификацией не потому, что пространство имен отсутствует в XMLPHP Чистый XML в SOAP

Освобожденные XML

<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> 

Что я имею в actualy отправки (нет имен в 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> 

Мой PHP код

$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()); 
} 

Есть ли способ, которым я мог бы просто отправить XML-строку в SOAPclient?

ответ

1

Вам не хватало конечной косой черты в пространстве имен, так что это, вероятно, было частью проблемы.

Это случай, когда функция classmap может помочь. Попробуйте этот код:

$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()); 
} 

код производит запрос XML, который выглядит как:

<?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>