2016-07-27 16 views
1

Ich hoffe wirklich, dass ich es geschafft habe, richtigen Titel dafür zu schreiben. Im Grunde muss ich eine Verbindung herstellen, um eine Soap-Anfrage an eine bestimmte URL zu stellen und Daten von dort abzurufen.PHP SOAP senden Umschlag an WSDL

Dies ist Anfrage, die ich senden müssen:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:rad="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Request" xmlns:rad1="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Security.Request"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:RetrieveSecurityToken> 
     <!--Optional:--> 
     <tem:RetrieveSecurityTokenRequest> 
      <rad:CarrierCodes> 
       <!--Zero or more repetitions:--> 
       <rad:CarrierCode> 
        <rad:AccessibleCarrierCode>FZ</rad:AccessibleCarrierCode> 
       </rad:CarrierCode> 
      </rad:CarrierCodes> 
      <rad1:LogonID>xxx</rad1:LogonID> 
      <rad1:Password>xxxx</rad1:Password> 
     </tem:RetrieveSecurityTokenRequest> 
     </tem:RetrieveSecurityToken> 
    </soapenv:Body> 
</soapenv:Envelope> 

Dies ist mein Code

$url = "http://uat.ops.connectpoint.flydubai.com/ConnectPoint.Security.svc?wsdl"; 
$data = array( "LogonID"=>"xxxxx", "Password"=>"xxxxx"); 

$client = new SoapClient($url); 

$client->__soapCall("RetrieveSecurityToken", $data); 

Und Anforderungsfehler

Fatal error: Uncaught SoapFault exception: [a:DeserializationFailed] The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'RetrieveSecurityToken'. End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 162. in J:\WORK\web\flyDubai\index.php:25 Stack trace: #0 J:\WORK\web\flyDubai\index.php(25): SoapClient->__soapCall('RetrieveSecurit...', Array) #1 {main} thrown in J:\WORK\web\flyDubai\index.php on line 25` 

, wenn ich rufe __getTypes() i erhalten (unter anderem):

struct RetrieveSecurityToken { 
    string LogonID; 
    string Password; 
} 

Ich denke, diese Anfrage, die ich mache, ist nicht korrekt (vielleicht sollte ich ganze XML in Array konvertiert), aber ich kann nicht herausfinden, wie man richtig senden?

Antwort

0

Die Methode, die Sie aufrufen, erwartet RetrieveSecurityTokenRequest Parameter des Typs RetrieveSecurityToken, der in der enthaltenen XSD file definiert ist. Dort können Sie sehen, dass es von CarrierInfo erweitert wird, LogonID und Password Eigenschaften hinzufügen.

Basistyp CarrierInfo ist in anderen XSD file definiert. Es hat eine einzige Eigenschaft CarrierCodes vom Typ ArrayOfCarrierCode, die ein Array von CarrierCode Objekten ist, die jeweils eine einzelne AccessibleCarrierCode Zeichenfolgeneigenschaft haben.

in der WSDL wird CarrierInfo als nillable angegeben (so dass <rad:CarrierCodes xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />) und leere Array (so dass <rad:CarrierCodes/>) sein kann, aber der Dienst mit Fehlern in diesen Fällen ist die Beantwortung.

Das ist also, warum Sie wahrscheinlich Anfrage nach der XML-Beispiel erstellen, sollten Sie in der Frage gestellt, mit mindestens einem Trägercode:

$code = new StdClass; 
$code->AccessibleCarrierCode = "FZ"; 

$data = new StdClass; 
$data->CarrierCodes = array($code); 

$data->LogonID = "xxxxx"; 
$data->Password = "xxxxx"; 

$client = new SoapClient($url); 
$response = $client->RetrieveSecurityToken(array("RetrieveSecurityTokenRequest" => $data)); 

var_dump($response);