PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   SoapClient - Aufruf übergibt nicht alle Parameter (http://www.selfphp.de/forum/showthread.php?t=24335)

nites 08.08.2011 18:13:59

SoapClient - Aufruf übergibt nicht alle Parameter
 
Hallo zusammen,

ich bin noch relativ neu was SOAP Aufrufe durch PHP angeht und laufe eigentlich fast sofort in einen Fehler.

Folgender Maßen stelle ich eine Verbindung her.

PHP-Code:

$option = array
(
'trace'=>1,
'soap_version'=> 'SOAP_1_2'//keine Ahnung ob das richtig ist
'exceptions' => true
); 
$client = new SoapClient('http://<IP>/<Info>?wsdl',$option); 

das klappt auch und mit

PHP-Code:

 echo "<pre>";
var_dump($client->__getFunctions());
 echo 
"</pre>"

bekomme ich auch die Funktionen die ich erwarte zurück.


Hiermit schaffe ich auch ein Login und bekomme eine SessionID zurück.

PHP-Code:

 //Logon
 
$function "logon";
 
$params->userName "userName";
 
$params->password "password";
 
 
$result $client->__soapCall("logon", array("parameters"=>$params), nullnull$output_headers); 

Jetzt komme ich aber nicht weiter.
Folgenden Befehl (natürlich mit gefüllten Variablen) funktioniert mit jmeter einwandfrei.
Code:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:viewCountries xmlns:ns2="http://[...]/">
<sessionId>${sessionId}</sessionId>
        <viewCountriesOrder>
        <destination>${destination}</destination>
        </viewCountriesOrder>
</ns2:viewCountries>
</S:Body>
</S:Envelope>

Sobald ich jetzt aber in php versuche, wird destination einfach nicht übergeben:
PHP-Code:

$function "viewCountries";
 
$params = new stdClass();
 
$params->sessionId $sessionId;
$params->viewCountriesOrder->destination "493049876089";
//oder auch mit 
  //$params->viewCountriesOrder = new stdClass(); 
  //$params->viewCountriesOrder->destination = "493049876089";
//oder auch mit 
 //$params->viewCountriesOrder->destination = "493049876089";
//klappt es nicht


 
use_soap_error_handler(true);
 
 
 try {
  
//oder//$result = $client->__soapCall($function, array("parameters"=>$params), null, null, $output_headers);
  
$result $client->$function ($params);
  echo 
"test";
}
catch(
SoapFault $e){
  
// handle issues returned by the web service
 
echo "SoapFault";
}
catch(
Exception $e){
  
// handle PHP issues with the request
 
echo "Exception";
}
 echo 
"<pre>getLastRequest - $function<br>";
 
var_dump(htmlentities($client->__getLastRequest()));
 echo 
"</pre>";
 echo 
"<pre>getLastRequestHeaders - $function<br>";
 
var_dump(htmlentities($client->__getLastRequestHeaders()));
 echo 
"</pre>";
 echo 
"<pre>getLastResponse - $function<br>";
 
var_dump(htmlentities($client->__getLastResponse()));
 echo 
"</pre>";
 echo 
"<pre>getLastResponseHeaders - $function<br>";
 
var_dump(htmlentities($client->__getLastResponseHeaders()));
 echo 
"</pre>"

Ich bekomme zurück

Code:

string(436) "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://[...]/"><SOAP-ENV:Body><ns1:viewCountries><sessionId>8138896</sessionId><viewCountriesOrder/></ns1:viewCountries></SOAP-ENV:Body></SOAP-ENV:Envelope>
"


Ich bin jetzt mit meinem Latein am Ende, da ich auch nicht weiß, was der / die Aufrufe genau machen und die paramter verarbeiten.

Mit Hoffnung auf Hilfe.

Gruß
nites

DokuLeseHemmung 08.08.2011 18:59:54

AW: SoapClient - Aufruf übergibt nicht alle Parameter
 
Tipp:
Hiermit die Typen abfragen.
PHP-Code:

 echo "<pre>"
var_dump($client->__getTypes()); 
 echo 
"</pre>"

Und dann nicht stdClass verwenden, sondern eigene Typeklassen erstellen.

Wie das gehen kann ist hier ganz gut beschrieben:
http://phpforum.de/forum/showthread.php?t=257851

nites 09.08.2011 11:29:42

AW: SoapClient - Aufruf übergibt nicht alle Parameter
 
Danke schon mal, aber leider klappts irgendwie immer noch nicht.

Irgendwie bekomm ich nicht hin, dass die Order korrekt aufgebaut wird.

PHP-Code:

class RequestType
{
    public 
$destination;
}
$option = array
(
'trace'=>1,
'soap_version'=> 'SOAP_1_2',
'exceptions' => true,
); 
$option['classmap']['order'] = 'RequestType';
$order_destination = new RequestType;
$order_destination->destination "493049876089";

$client = new SoapClient('http://<IP>/<Info>?wsdl',$option);

 
$function "viewCountries";

 
$params->sessionId $sessionId;
 
  
$result $client->$function ($params); 

Code:

getFunctions - viewCountries
array(29) { 
  [23]=>
  string(77) "viewCountriesResponse viewCountries(viewCountries $parameters)"
}

Code:

getTypes - viewCountries
array(111) {
  [2]=>
  string(807) "struct order {
 string destination;
}"
  [102]=>
  string(92) "struct viewCountries {
 long sessionId;
 viewCountriesOrder viewCountriesOrder;
}"
  [103]=>
  string(34) "struct viewCountriesOrder {
}"
  [104]=>
  string(67) "struct viewCountriesResponse {
 requestResult requestResult;
}"

Code:

getLastRequest - viewCountries
string(408) "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://[...]/">
<SOAP-ENV:Body>
<ns1:viewCountries>
<sessionId>7991583</sessionId>
</ns1:viewCountries>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
"

ungefähr so sollte es aussehen:
Code:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:viewCountries xmlns:ns2="http://[...]/">
<sessionId>${sessionId}</sessionId>
        <viewCountriesOrder>
        <destination>${destination}</destination>
        </viewCountriesOrder>
</ns2:viewCountries>
</S:Body>
</S:Envelope>

Wie bekomme ich denn hin, dass die sessionId vor viewCountries steht?
Code:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://[...]/">
xmlns:ns1="http://[...]/ muss ja auch wo anders stehen.

wenn ich statt
PHP-Code:

$result $client->$function ($params); 

dies benutze
PHP-Code:

$result $client->$function ($order_destination); 

bleibt der Request komplett leer.

Gruß
nites

DokuLeseHemmung 09.08.2011 13:40:57

AW: SoapClient - Aufruf übergibt nicht alle Parameter
 
Warum baust du nur einen Strukturtype, wo du doch offensichtlich mehrere anlegen solltest?

Leider kann ich das so nicht testen.
Darum endet meine Hilfe auch hier.

nites 09.08.2011 15:20:31

AW: SoapClient - Aufruf übergibt nicht alle Parameter
 
Hallo DokuLeseHemmung,

ich muss mich leider wie ein Dummy hier anstellen. Was meinst Du mit Strukturtype?

Der / die / das wsdl ist mir vorgegeben, ich möchte also nur die SOAP-Schnittstelle nutzen.

Leider kann ich die wsdl nicht zur Verfügung stellen, sondern nur Teile daraus posten.

Vielleicht hab' ich einfach an dem Prinzip noch etwas nicht verstanden, es wäre also toll, wenn Du einmal versucht mir das näher zu bringen.

Soweit ich das verstanden habe, muss ich die Pflichtfelder in der xml-Anfrage füllen. Diese Anfrage wird dann über die wsdl Adresse geschickt und dann von der Blackbox dahinter verarbeitet.

Warum kann ich dann nicht einfach die Pflichtfelder als einfach params mitgeben und fertig?
Ok, ich sehe, dass alles so aussieht wie in einem mehrdimensionalen Array und ich somit wahrscheinlich auf eine Sub-Ebene kommen muss, aber da das ganze sich nicht wie ein Array verhält, verstehe ich nur noch Bahnhof, da ich einfach nicht mehr weiß.

Gruß,
nites

nites 11.08.2011 14:16:44

AW: SoapClient - Aufruf übergibt nicht alle Parameter
 
Durch wsdl2php wurde mir eine php-Datei mit allen Klassen etc. erzeugt.

Hier der Code des funktionierenden Aufrufs:

PHP-Code:

class order {
  public 
$destination// string
}

class 
viewCountriesSync {
  public 
$sessionId// long
  
public $viewCountriesOrder// viewCountriesOrderSync
}

class 
viewCountriesOrderSync {
}


class 
SoapCountriesService extends SoapClient {

  private static 
$classmap = array(
                                    
'order' => 'order',
                                    
'viewCountriesSync' => 'viewCountriesSync',
                                    
'viewCountriesOrderSync' => 'viewCountriesOrderSync',
                                   );

  public function 
SoapCountriesService($wsdl "http://[ip]/SoapCountries?wsdl"$options = array()) {
    foreach(
self::$classmap as $key => $value) {
      if(!isset(
$options['classmap'][$key])) {
        
$options['classmap'][$key] = $value;
      }
    }
    
parent::__construct($wsdl$options);
  }
  
  
   
/**
   *  
   *
   * @param viewCountriesSync $parameters
   * @return viewCountriesSyncResponse
   */
  
public function viewCountriesSync(viewCountriesSync $parameters) {
    return 
$this->__soapCall('viewCountriesSync', array($parameters),       array(
            
'uri' => 'http://Countries.[...]/',
            
'soapaction' => ''
           
)
      );
  }
  
  
$wsdl 'http://[ip]/SoapCountries?wsdl';

$client = new SoapCountriesService($wsdl,$option);
  
//Logon
$function "logon";
$req = new logon;
$req->userName "user";
$req->password "pw";

$result $client->$function ($req);

$sessionId_logon $result->sessionId



 
$function "viewCountriesSync";

$req = new viewCountriesSync;
$req->sessionId $sessionId_logon;


$req_sub_order = new order;
$req_sub_order->destination "4917250123445";

$req->viewCountriesOrder $req_sub_order;


 
 
use_soap_error_handler(true);
 
 
try {
  
$result $client->$function ($req);
}
catch(
SoapFault $e){
 echo 
"SoapFault";
}
catch(
Exception $e){
 echo 
"Exception";
}


 echo 
"<pre>getLastRequest - $function<br>";
 
var_dump(htmlentities($client->__getLastRequest()));
 echo 
"</pre>";
 echo 
"<pre>getLastRequestHeaders - $function<br>";
 
var_dump(htmlentities($client->__getLastRequestHeaders()));
 echo 
"</pre>";
 echo 
"<pre>getLastResponse - $function<br>";
 
var_dump(htmlentities($client->__getLastResponse()));
 echo 
"</pre>";
 echo 
"<pre>getLastResponseHeaders - $function<br>";
 
var_dump(htmlentities($client->__getLastResponseHeaders()));
 echo 
"</pre>";
 echo 
"<pre>getFunctions - $function<br>";
 
var_dump($client->__getFunctions());
 echo 
"</pre>";
 echo 
"<pre>getTypes - $function<br>";
 
var_dump($client->__getTypes());
 echo 
"</pre>"



Alle Zeitangaben in WEZ +2. Es ist jetzt 01:15:54 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.