SOAP Rückgabe: stdClass Object()

Arndtinho

Erfahrenes Mitglied
Hallo,

ich versuche gerade ein Login per SOAP Webservice zu basteln. Die WSDL (bzw. den wichtigen Auszug habe ich an das Psosting angehängt) ist vorgegeben, und da ich vorher noch nicht mit ComplexType's in einer WSDL gearbeitet habe, weiß ich nicht so recht, wie ich das anstellen muss. Da ich nur die WSDL habe, versuche ich mir einen kleine Testumgebung aufzubauen. Das ist mein Server:
PHP:
ini_set("soap.wsdl_cache_enabled", "0");

$url = "test.wsdl";

try {
	$server = new SoapServer($url); 
	$server->setClass("User"); 
	$server->handle();
}
catch (SOAPFault $f) {
	echo "Server-Error: ".$f->getMessage();
}


class User {
	public $authUser = null;
	public $param	  = "";
	
	public function __construct() {
		$this->authUser = new getAuthUserResponse();
	}
	
	public function getAuthUser($param) {
		return $this->authUser;
	}
}

class getAuthUserResponse {
	
	public $userEmail     = "test@test.de";
	public $userFirstName = "Max";
	public $userLastName  = "Mustermann";
}
Der entsprechende Client dazu:
PHP:
ini_set("soap.wsdl_cache_enabled", "0");

$url = "test.xml";

try {
	$oClient = new SoapClient($url);
	
	$res = $oClient->getAuthUser('test');
	print_r($res);
}
catch (SOAPFault $f) {
	echo "Client-Error: ".$f->getMessage()."<br>Line: ".$f->getLine();
}
Das print_r bringt mir das Ergebnis: stdClass Object() . Ein var_dump($res) bringt dies: object(stdClass)#2 (0) { } . Meiner Ansicht nach, sollten doch da die Variablen des authUser-Objekts drin stehen, oder sehe ich da was falsch?
Oder habe ich den Server völlig falsch aufgebaut (wie gesagt, ich versuche mich da an die WSDL zu halten)?

Viele Grüße
Arndtinho
 

Anhänge

mit Klassen hab ich noch nichts mit webservice gemacht. Habe mal gegooelt

-> http://devzone.zend.com/node/view/id/689 such in der seite mal nach klassen da findest du ein client server beispiel.

Ansonsten kannst du dir unter -> http://www.tutorials.de/forum/php/321017-webservice-mit-nusoap-funktionsrueckgabe-array.html wie man mit addComplexType ein Array zurück gibt.

Deine meldung kommt bei mir wenn ich ein array zurückgeben will mit addComplexType in dem nichts drin steht.

So jetzt noch ne andere frage weisst du wie ich einem client ein timeout mitgeben ?
 
Hallo BillaBong,

danke für die beiden Links. Ich werde mir das anschauen und dann ein Ergebnis verkünden.
Hoffe, es wird positiv.

Bei Deiner Frage kann ich Dir leider nicht helfen.

Viele Grüße
Arndtinho
 
Zuletzt bearbeitet:
Guten Morgen,

die beiden Links haben mir leider nicht geholfen.
Bei dem ersten Beispiel, werden keine ComplexTypes verwendet. Zumindest habe ich das nicht gelesen. Der einfachere Weg ohne die Types funktioniert problemlos. Aber leider kann ich die WSDL nicht dementsprechend ändern.

Ich kann gar nicht glauben, dass es im WWW keine Beispiele / Tutorials geben soll.

Viele Grüße
Arndtinho
 
Morgen....

ich finde auch die hälfte der zeit nichts brauchbares wenn es um das Thema geht. Jede menge unbeantworteter Foren posts, die findet man :-).
 
Was die Posts angeht muss ich Dir leider recht geben.
Ich muss mit Klassen arbeiten, da die ganze Geschichte vom Kunden so vorgegeben wird. Er hat mir die WSDL zur Verfügung gestellt und um da meine Anfragen zu testen, versuche ich eine halbwegs realistische Testmgebung nachzubauen. Das heißt, den Server zu simulieren und da meine Anfragen hinzusenden. Wie gesagt, ohne ComplexTypes funktioniert alles, nur mit nicht. Irgendwo habe ich da einen Denkfehler, denn so schwer kann das ja nicht sein.

Viele Grüße
Arndtinho
 
Also ich habe jetzt mal deine Server Client version da umgebaut das sie bei mir funktioniert. Ich hoffe das ist sowas was du suchst. Ich habe das addComplexType auch bis jetzt nur bei PHP4 mit NuSoap gebraucht wenn ich ein Array zurück geben wollte. PHP5 Soap kann das schon von haus aus.

server.php
PHP:
<?php
ini_set("soap.wsdl_cache_enabled", "0");



try {
    $server = new SoapServer(NULL,array('uri' => "http://localhost/server.php"));
    $server->setClass("User");
    $server->handle();
}
catch (SOAPFault $f) {
    echo "Server-Error: ".$f->getMessage();
}


class User {
    public $authUser = null;
    public $param      = "";

    public function __construct() {
        $this->authUser = new getAuthUserResponse();
    }

    public function getAuthUser($param) {
        return $this->authUser;
    }
}

class getAuthUserResponse {

    public $userEmail     = "test@test.de";
    public $userFirstName = "Max";
    public $userLastName  = "Mustermann";
}

?>

client.php

PHP:
ini_set("soap.wsdl_cache_enabled", "0");


try {
    $oClient = new SoapClient(NULL,
		array(
			"location" => "http://localhost/server.php",
			"uri" => "urn:xmethodsTestServer",
			"style" => SOAP_RPC,
			"use" => SOAP_ENCODED
		));

    $res = $oClient->getAuthUser('User');
    print_r($res);
}
catch (SOAPFault $f) {
    echo "Client-Error: ".$f->getMessage()."<br>Line: ".$f->getLine();
}


Sag mal bescheid ob du dir das so vorgestellt hast ?
 
Zuletzt bearbeitet:
OH MAN ! Arndtinho du bist der Hammer und zwar hast du mich auf die Lösung gebracht nach der ich schon seit ner woche suche.Und zwar brauch ich einen timeout für meinen webserver da der sonst zu lange wartet wenn nichts passiert und dein ini_set kam mir so bekannt vor. Als ich vorhin deinen server umgebaut hatte ist es mir wieder eingefallen ich hatte es wo gelesen konnte aber nichts damit anfangen.

Lösung : ->>>

PHP:
ini_set('default_socket_timeout', 2);

echt klasse !! Danke :)
 
Hey BillaBong,

schön, dass ich Dir helfen konnte :)

Bei mir funktioniert jetzt auch alles. Bin die ganze Geschichte nochmal Schritt für Schritt durchgegangen und kann nun endlich auch auf das zurückgelieferte Objekt zugreifen. Weiß aber nicht so recht was ich geändert haben könnte. Aber es klappt erstmal.

Viele Grüße
Arndtinho
 
Zurück