PHP SOAP Call

moos1407

Ensign
Registriert
Sep. 2008
Beiträge
186
Hallo zusammen,

ich möchte mit Hilfe von SOAP Daten von comunio.de abfragen. Nur komm ich da jetz an einer Stelle nicht mehr weiter.
Die Verbindung an sich klappt und ich erhalte auch Daten, solange die die Paramter als int oder string kommen.

PHP:
<?php

$wsdl = "http://www.comunio.de/soapservice.php?wsdl";
$parameter = Array(
	'login' 		=> "hanswurst",
	'password'		=> "1234",
	'soap_version'	=> SOAP_1_2,
	'exceptions'	=> True,
	'trace'			=> 1
);

$client = new SOAPClient($wsdl,$parameter);

$playerID_XYZ = 8821312;



$communityID = $client->getcommunityid($playerID_XYZ);
var_dump($communityID);

$communityName = $client->getcommunityname($communityID);
var_dump("</br>".$communityName);

$playerName = $client->getusersname($playerID_XYZ);
var_dump("</br>".$playerName);


echo "<h3>Functions</h3>";
$functions = $client->__getFunctions();
foreach($functions as $d){
	echo "</br>".$d;
}
echo "</br><h3> Types</h3>";
$types = $client->__getTypes();
foreach($types as $t){
	echo "<br>".$t;
}


// Kill the link to Soap
unset($client); 

?>

Die drei Funktionen getcommunityid, getcommunityname und getusersname funktionieren einwandfrei. Ich erhalte halt jeweils nur einen int oder string.


An folgender Funktion bin ich schon seit ein paar Stunden dran und bekomms nicht hin. Ich bin mir nicht mal sicher, ob ich da jetzt ein Array bekomme oder ein Objekt/struct:

ArrayOfPlayerlineup getuserscurrentlineup(int $userid)


__getFunctions und __getTypes spucken folgendes aus:

struct ArrayOfPlayerlineup { Playerlineup Playerlineup; }
struct Playerlineup { int id; string name; int points; int clubid; Position position; Active_starter active_starter; }

string Active_starter
string Position

Ich denke, ich muss den Aufbau des Objekts/des Arrays irgendwie nachbauen und dann die Übergabewerte reinspeichern. Hab schon einiges ausprobiert, aber bekomms nicht hin. Kann mir da jemand helfen?
 
Ich verstehe dein Problem nicht ganz. Mal davon abgesehen, dass es in PHP kein struct gibt.

Was gibt denn
Code:
var_dump($client->getuserscurrentlineup($userid));
aus?

Übrigens halte ich
Code:
$playerID_XYZ = 8821312;
für unsauber. Entweder ist es nur eine einzelne ID, dann $playerID, oder es sind mehrere, dann $playerIDs = []. Eine Variable spezifisch zu benennen, widerspricht ja der Definition einer Variable.
 
Zuletzt bearbeitet:
Erstmal danke für deine Antwort.

paunaro schrieb:
Was gibt denn
Code:
var_dump($client->getuserscurrentlineup($userid));
aus?

Syntax error. Man muss wie bei den anderen Funktionen die übergebenen Werte erst in eine Variable/Instanz speichern (denke ich).

paunaro schrieb:
Übrigens halte ich
Code:
$playerID_XYZ = 8821312;
für unsauber. Entweder ist es nur eine einzelne ID, dann $playerID, oder es sind mehrere, dann $playerIDs = []. Eine Variable spezifisch zu benennen, widerspricht ja der Definition einer Variable.

Ja das hast du Recht. Aber das hier dient nur zum testen und da hab ich halt meine eigene ID benutzt. Später baue ich ein html Dokument mit einem Eingabefeld für die ID und dieser Wert wird dann in $playerID gespeichert.


Hier mal ein Beispiel der Funktion getusersname():
__getFunctions liefert dafür folgendes: string getusersname(int $userid)
Ich übergeb also den Integer $userid und bekomme einen String (mit dem Namen des Spielers).
In meinem Code speicher ich den String in $playerName. Das ist auch recht einfach.

Mein Problem ist die Funktion getuserscurrentlineup();
__getFunctions liefert: ArrayOfPlayerlineup getuserscurrentlineup(int $userid)
Ich übergeb also einen Integer und bekomme "ArrayOfPlayerlineup". (Bin mir nicht sicher, was das für ein Datentyp ist. Ich denke es ist ein Objekt)

Ich kann ArrayOfPlayerlineup nicht in eine Variable speichern.
PHP:
$playerLineup = $client->getuserscurrentlineup($playerID_XYZ)
funktioniert nicht, da wohl etwas komplexeres zurückübergeben wird.

Also muss man sich anschaun, was ArrayOfPlayerlineup ist:
struct ArrayOfPlayerlineup { Playerlineup Playerlineup; } hier steige ich aus.
Ich kann alledings noch nachsehen, was Playerlineup ist:
struct Playerlineup { int id; string name; int points; int clubid; Position position; Active_starter active_starter; }


Ich hoffe, mein Problem wird damit verständlich. Ich glaube, ich muss die übergebenen Werte in einer instanzierten Klasse speichern, krieg den Aufbau davon aber nicht hin.
Ich vermute auch noch, dass die Klasse ein Array (Playerlinup) als Attribut besitzt.
 
Das Problem ist, ich kann es nicht ausprobieren, ohne mir eine Account zu erstellen (was ich nicht will). Und ich finde auch keine API-Beschreibung bei denen...

moos1407 schrieb:
Syntax error. Man muss wie bei den anderen Funktionen die übergebenen Werte erst in eine Variable/Instanz speichern (denke ich).
Hier ist ein Fehler im Code bei dir. Vielleicht die 1 (Zeilenummer) mit kopiert? Hast du denn einen vernünftigen Editor/IDE?

funktioniert nicht, da wohl etwas komplexeres zurückübergeben wird.
Nein, prinzipiell kannst du alles in eine Variable speichern. Und die Rückgabe kann eigentlich nur int,string,bool,array,object oder ressource sein (hab ich was vergessen?). Zumindest kein struct, da es das wie gesagt in PHP nicht gibt (im Endeffekt ist das auch nur ein Array)

struct ArrayOfPlayerlineup { Playerlineup Playerlineup; } hier steige ich aus.
Ich kann alledings noch nachsehen, was Playerlineup ist:
struct Playerlineup { int id; string name; int points; int clubid; Position position; Active_starter active_starter; }
solle sowas sein wie (bei Array)
Code:
Array
(
    ['Playerlineup'] => Array
        (
            ['id'] => 123
            ['name'] => 'foo'
            ...
        )
)
Oder halt ein Object (wie dein $client-Object)
Code:
SoapClient Object
(
    [_login] => hanswurst
    [_password] => 1234
    [trace] => 1
    [_soap_version] => 1
    [sdl] => Resource id #12
)
 
Zuletzt bearbeitet:
SOAP "Complex Types" sind in PHP stdClass Objects.

Was ArrayOfPlayerlineup ist, steht doch alles in der WSDL beschrieben. Die könnte man natürlich auch parsen...

XML:
            <xsd:complexType name="ArrayOfPlayerlineup">
                <xsd:sequence>
                    <xsd:element name="Playerlineup" type="tns:Playerlineup" minOccurs="0" maxOccurs="unbounded" />
                </xsd:sequence>
            </xsd:complexType>

Jedenfalls ist ArrayOfPlayerlineup ein stdClass Object mit einem Attribut vom Typ Array und namen Playerlineup, welches 0 bis n "Playerlineup"s enthält, welches

XML:
            <xsd:complexType name="Playerlineup">
                <xsd:all>
                    <xsd:element name="id" type="xsd:int" />
                    <xsd:element name="name" type="xsd:string" />
                    <xsd:element name="points" type="xsd:int" />
                    <xsd:element name="clubid" type="xsd:int" />
                    <xsd:element name="position" type="tns:Position" />
                    <xsd:element name="active_starter" type="tns:Active_starter" />
                </xsd:all>
            </xsd:complexType>

Wiederum so aufgebaut ist usw.

Der Request hat zu erfolgen mit einem stdObject, welches ein Attribut "userid" vom Typ Integer enthält.

Also, um das verworrene Zeug abzukürzen (quick'n'dirty, bitte nicht einfach c+p - "neue" syntax):

PHP:
$client = new SOAPClient($wsdl,$parameter);

// ... Tralala dazwischen

$getuserscurrentlineupRequest = (object) [
    'userid' => 182937
];

$getuserscurrentlineupResponse = $client->getuserscurrentlineup($getuserscurrentlineupRequest);

foreach ($getuserscurrentlineupResponse->Playerlineup as $Playerlineup): 
    echo $Playerlineup->name; // String, Name
    echo $Playerlineup->points; // Integer, Punkte
endforeach;

Das "Maggie" findet in Zeile 5-7 statt, wo ein PHP-Array (kurz geschrieben nur noch mit eckigen Klammern) in ein Type "Object" gecasted wird, wodurch es eine Instanz der Klasse stdObject erzeugt wird, die ein Attribut vom Typ Integer mit dem Namen userid enthält. Das ist das erwartete Eingabeformat des API-Endpunkts (REST) oder Operation (SOAP) (und nicht Funktion ...) "getuserscurrentlineup". Kann man in der WSDL oder der nicht vorhandenen(???) API-Dokumentation nachlesen.

Eine API ist übrigens nur so gut wie ihre Dokumentation. Deswegen hat man normalerweise eine erstklassige Dokumentation.
 
Zuletzt bearbeitet:
So, ich hab mich nochmal mit dem Thema beschäftigt und auch herausgefunden, wie es funktioniert. Sollte irgend jemand mal auf diesen Thread stoßen, dann ist ihm dadurch geholfen. :)

Ich veranschauliche das an der function: ArrayOfNewsItem getcomputernews(int $communityid, int $days, int $items). Ich sende also einen Request, dem ich 3 Integer-Werte mitgebe.
PHP:
$communityID = 123456;
$getcomputernewsResponse = $client->getcomputernews($communityID,1,1);
Mit var_dump($getcomputernewsResponse) sieht man:
array(1) { [0]=> object(stdClass)#2 (4) { ["date"]=> string(25) "2018-09-27T04:44:58+02:00" ["author"]=> string(8) "Computer" ["subject"]=> string(9) "Transfers" ["message"]=> string(1676) "Kraft wechselt für 310.010 von Computer zu Stefan.
Burgstaller wechselt für 3.003.000 von Stefan zu Computer.
Brandt wechselt für 8.589.000 von Thomas zu Computer.
" } }

Das bedeutet, ich bekomme als Antwort ein Array mit einem Array Element. Dieses Element ($getcomputernewsResponse[0]) beinhaltet ein Objekt mit den Attributen date, author, subject und message.

Es gibt einige Wege, auf die einzelnen Attribute zuzugreifen oder weiterzuverarbeiten. Zum Beispiel:
PHP:
// Das eine Array-Element in eine eigene Variable speichern
$object = $getplayersboughtResponse[0];

// Auf die Attribute des Objekts zugreifen und ausgeben
echo $object->message;

Das wars auch schon. Leider sind viele functions nur für Plus/Pro- Player/Comunios freigeschaltet. :/
Ich habe mir jetzt eine Website gebastelt. Dort kann ich zum Beispiel einen BL-Spieler eingeben und ich erfahre dann, für welchen Spieler aus meiner Comunio-Gruppe er im Einsatz ist (Die Seite ist noch nicht perfekt, aber funktioneren tut sie schon mal).
 
Zurück
Oben