jasso Geschrieben 27. März 2009 Geschrieben 27. März 2009 Hallo Leute, ich soll einen Webservice per PHP ansprechen und krieg das irgendwie nicht gebacken. alle Beispiele die ich per Google finden laufen erstmal auf:$client = new SoapClient('...'); raus. soap ist in meiner PHP.ini aktiviert soap Soap Client enabled Soap Server enabled Directive Local Value Master Value soap.wsdl_cache_dir /tmp /tmp soap.wsdl_cache_enabled 1 1 soap.wsdl_cache_ttl 86400 86400 mein kompletter Testcode sieht momentan so aus:<?php echo "1<br>"; $client = new SoapClient('https://scripts.portal-anmeldung.de/ws1/service1.asmx'); echo "2<br>"; $result = $client->Eeeeeeeeechooooo('nudelsuppe'); echo "3<br>"; echo $result; ?> [/PHP] wobei https://scripts.portal-anmeldung.de/ws1/service1.asmx ein eigener kleiner testwebservice von mir ist. nur leider bricht das ganze schon beim [PHP]new SoapClient(.. ab. Kann mir hier bitte jemand weiterhelfen? danke lg jasso Zitieren
LordHexa Geschrieben 27. März 2009 Geschrieben 27. März 2009 Welche Version von PHP nutzt du? Zitieren
T3D Geschrieben 27. März 2009 Geschrieben 27. März 2009 mein kompletter Testcode sieht momentan so aus:<?php echo "1<br>"; $client = new SoapClient('https://scripts.portal-anmeldung.de/ws1/service1.asmx'); echo "2<br>"; $result = $client->Eeeeeeeeechooooo('nudelsuppe'); echo "3<br>"; echo $result; ?> [/PHP] vor einem Jahr stsand ich vor genau dem gleichen problem ich finds schade das SOAP in verbindung mit PHP so ungenau und unschoen documentiert war/ist. zu deinem problem.. versuch mal $client = new SoapClient('https://scripts.portal-anmeldung.de/ws1/service1.asmx?WSDL'); weil die syntax vom constract ja SoapClient::SoapClient ( mixed $wsdl [, array $options ] ) ist, er findet aber keine wsdl daten unter deine angegbenen addresse wenn du weiter probleme hast, schrei ruhig... konnte damit im letzten jahr ne menge erfahrung sammeln Zitieren
jasso Geschrieben 27. März 2009 Autor Geschrieben 27. März 2009 PHP-Version PHP Version 5.0.4 mein Code sieht jetzt so aus: <?php echo "1<br>"; $client = new SoapClient('https://scripts.portal-anmeldung.de/ws1/service1.asmx?WSDL'); echo "2<br>"; $result = $client->Eeeeeeeeechooooo('de_en'); echo "3<br>"; echo $result; ?>[/PHP] leider hab ich das Problem immer noch. Er bricht in der selben Zeile ab. Find ich aber erfreulich wenn jemand damit Erfahrung hat lg jasso Zitieren
T3D Geschrieben 27. März 2009 Geschrieben 27. März 2009 mein testclient sieht immer so aus:´ error_reporting(E_ALL); ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache... ini_set("display_errors", "1"); // errors on... try { echo "1<br>"; $client = new SoapClient('https://scripts.portal-anmeldung.de/ws1/service1.asmx?WSDL'); echo "2<br>"; $result = $client->Eeeeeeeeechooooo('de_en'); echo "3<br>"; echo $result; } catch (SoapException $e) { var_dump($e); } ?> [/PHP] damit bekommst du dann halt die fehlermeldung ausgegeben die dir Soap erzeugt. versuch es mal damit. ich kann dir schon ma vorneweg sagen: echo $result; ist nicht korrekt. da du ein Object zurück bekommst var_dump($result); empfehl ich dir fuers erste. uebrigens geht dein code bei mir ted Zitieren
jasso Geschrieben 30. März 2009 Autor Geschrieben 30. März 2009 :upps Errors auszugeben sollte eigentlich der erste gedanke sein (ja war denn schon Freitag ...) Hat mir auf jeden fall schonmal sehr weitergeholfen. Das Problem war einfach das fehlende openssl. Soweit funktioniert das nun auch. Als nächstes bekomme ich vom Webservice irgendwie kein Ergebnis zurück (Mal davon abgesehen dass eine Class 'SoapException' allem anschein nach ncht gefunden werden kann ... macht aber nix mit Exception funktionierts). Kann ich mir aus der SoapClient-Klasse die Gesendete und erhaltene XML auslesen? lg jasso Zitieren
jasso Geschrieben 30. März 2009 Autor Geschrieben 30. März 2009 Sorry für doppelpost (edit geht nicht mehr): anzufügen wäre hier evtl dass ich:<?PHP error_reporting(E_ALL); ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache... ini_set("display_errors", "1"); // errors on... try { echo "1<br>"; $client = new SoapClient('https://scripts.portal-anmeldung.de/ws1/service1.asmx?WSDL', array('trace' => 1)); echo "2<br>"; $result = $client->Eeeeeeeeechooooo('test'); echo "3<br>"; echo "ANFRAGE:<br>" . $client->__getLastRequest() . "<br>"; echo "4<br>"; var_dump($result); } catch (Exception $e) { var_dump($e); } ?>[/PHP] bereits probiert habe und keine Ergebnisse bekomme. Ergebnisseite sieht folgendermaßen aus:1 2 3 ANFRAGE: 4 object(stdClass)#2 (0) { } Zitieren
T3D Geschrieben 30. März 2009 Geschrieben 30. März 2009 :upps Errors auszugeben sollte eigentlich der erste gedanke sein (ja war denn schon Freitag ...) Hat mir auf jeden fall schonmal sehr weitergeholfen. Das Problem war einfach das fehlende openssl. Soweit funktioniert das nun auch. Als nächstes bekomme ich vom Webservice irgendwie kein Ergebnis zurück (Mal davon abgesehen dass eine Class 'SoapException' allem anschein nach ncht gefunden werden kann ... macht aber nix mit Exception funktionierts). Kann ich mir aus der SoapClient-Klasse die Gesendete und erhaltene XML auslesen? lg jasso zurueckbekommen hatte ich allerdings auch nur nen leeres object, was aber nich bedeuten muss das es falsch ist ich geb dir einfach mal mein komplettes test-client-script, glaube das ist die einfachste variante <?PHP error_reporting(E_ALL); ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache... ini_set("display_errors", "1"); // errors on... ini_set("memory_limit","512M"); try { $soapy = new SoapClient('URL?wsdl&'.time(), array( "trace" => 1, )); // echo "<font color=\"green\"><br />ShowAllFunctions:<br />"; $result = $soapy->__getFunctions(); echo "<pre>", var_dump($result) , "</pre>"; echo "</font><br /><br />"; try { $result = $soapy->__call("FUNCTION", array()); echo "<pre>", var_dump($result) , "</pre>"; } catch (SoapFault $e) // Wenn der Call einen Error wirft { $result = $soapy->__getLastRequest(); echo str_replace("><", "><br><", htmlentities($result)); echo "<font color=\"red\"><br />Soapfault:<br />"; echo "<pre>", var_dump($e) , "</pre>"; } } catch (SoapException $e) { var_dump($e); } [/PHP] der fehler am freitag war uebrigens das du in deiner php.ini den wert soap.wsdl_cache_enabled 1 1 stehn hast. solange du an der schnittstelle programmierst.. achte immer darauf das du die daten nicht ausm cache laedst deswegen steht an meiner wsdl auch "&'.time()" dran, sollte aber auch mit ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache... erledigt sein Ted EDIT: du musst fuer lastRequest / Response "trace" auf 1 setzen! Zitieren
jasso Geschrieben 30. März 2009 Autor Geschrieben 30. März 2009 Habe jetzt "soap.wsdl_cache_enabled=0" in der PHP.ini gesetzt um den cache mal auszuschließen. bis auf die sache mit "&'.time()" funktioniert der Testcode auch wunderbar<?PHP error_reporting(E_ALL); ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache... ini_set("display_errors", "1"); // errors on... ini_set("memory_limit","512M"); try { $soapy = new SoapClient('https://scripts.portal-anmeldung.de/ws1/service1.asmx?WSDL', array( "trace" => 1, )); // echo "<font color=\"green\"><br />ShowAllFunctions:<br />"; $result = $soapy->__getFunctions(); echo "<pre>", var_dump($result) , "</pre>"; echo "</font><br /><br />"; try { $result = $soapy->__call("Eeeeeeeeechooooo", array("blub")); echo "<pre>", var_dump($result) , "</pre>"; echo "<font color=\"blue\"><br />LastRequest:<br />"; $result = $soapy->__getLastRequest(); echo str_replace("><", "><br><", htmlentities($result)); echo "</font><br><br>"; echo "<font color=\"blue\"><br />LastResponse:<br />"; $result = $soapy->__getLastResponse(); echo str_replace("><", "><br><", htmlentities($result)); echo "</font><br><br>"; } catch (SoapFault $e) // Wenn der Call einen Error wirft { $result = $soapy->__getLastRequest(); echo str_replace("><", "><br><", htmlentities($result)); echo "<font color=\"red\"><br />Soapfault:<br />"; echo "<pre>", var_dump($e) , "</pre>"; } } catch (Exception $e) { var_dump($e); } ?>[/PHP]Er gibt mir schön die vorhandenen Funktionen aus und ich kann die Funktion allem anschein nach auch aufrufen. Nur kommt halt nach wie vor kein Ergebnis zurück: [color=SeaGreen]ShowAllFunctions: array(2) { [0]=> string(71) "EeeeeeeeechoooooResponse Eeeeeeeeechooooo(Eeeeeeeeechooooo $parameters)" [1]=> string(53) "HelloWorldResponse HelloWorld(HelloWorld $parameters)" }[/color] object(stdClass)#2 (0) { } [color=Blue]LastRequest: <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> <SOAP-ENV:Body> <ns1:Eeeeeeeeechooooo/> </SOAP-ENV:Body> </SOAP-ENV:Envelope> LastResponse: <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance'>http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <EeeeeeeeechoooooResponse xmlns="http://tempuri.org/" /> </soap:Body> </soap:Envelope>[/color]Das Problem scheint hier zu sein dass er mir im Request den Parameter "schluckt". Rufe ich die HelloWorld-Funktion auf wird die Rückgabe korrekt serialisiert (also funktioniert das schonmal wunderbar). Nur wie gesagt die Parameter gehen irgendwo verloren. lg jasso Zitieren
T3D Geschrieben 30. März 2009 Geschrieben 30. März 2009 $result = $soapy->__call("Eeeeeeeeechooooo", array("blub")); wenn ich das richtig gesehn hab heist die var die erwartet "echo" <wsdl:operation name="Eeeeeeeeechooooo"> <wsdl:input message="tns:EeeeeeeeechoooooSoapIn" /> <wsdl:output message="tns:EeeeeeeeechoooooSoapOut" /> </wsdl:operation> <wsdl:message name="EeeeeeeeechoooooSoapIn"> <wsdl:part name="parameters" element="tns:Eeeeeeeeechooooo" /> </wsdl:message> <s:element name="Eeeeeeeeechooooo"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="echo" type="s:string" /> </s:sequence> </s:complexType> </s:element> das muss dann so aussehn: $param = new stdClass(); $param->echo = "blubb"; $result = $soapy->__call("Eeeeeeeeechooooo", array("parameters" => $param)); [/PHP] kurze erklaerung dazu: du sprichst mit dem aufruf der methode/funktion die operation "Eeeeeeeeechooooo" an, wo definiert wird das der uebergabe parameter aussehen soll wie in der msg "tns:EeeeeeeeechoooooSoapIn" beschrieben. die message sagt: ich erwarte ein parameter der so aussieht: <wsdl:part name="parameters" element="tns:Eeeeeeeeechooooo" /> also einen Parameter namens "parameters" welches den inhalt vom "complexType" "Eeeeeeeeechooooo" beinhaltet. da soap mit objecten arbeitet musst du dies auch als object uebergeben... ist fuer mich irgendwie schwer zu erklaeren, aber vielleicht kannst du mit code und meinem wirrwar da schon mal nen bissl was anfangen Zitieren
jasso Geschrieben 30. März 2009 Autor Geschrieben 30. März 2009 (bearbeitet) doch ... durchaus verständlich. hab mir sowas ähnliches auch schon gedacht nur noch nicht recht gewusst wie ich nen complexType selber zusammenschraube du bist jetzt mein persönlicher hero-des-monats^^ danke erstmal. da ich jetzt den Testservice erfolgreich ansprechen kann werd ich mich mal an den externen wagen. Ich hoffe ich darf dich auch weiterhin mit Fragen hierzu löchern falls ich z.B. mit der Authentifizierung nicht klar komme lg jasso Bearbeitet 30. März 2009 von jasso Zitieren
T3D Geschrieben 30. März 2009 Geschrieben 30. März 2009 natuerlich soap is eigentlich nur learning by ausprobiering *hust* weil wie gesagt.. echt schlecht dokumentiert, aber das soll sich ja mit irgend ner php version "demnaechst" aendern, zumindest waren das die ankuendigungen auf der php Conference und noch ein tipp <s:element minOccurs="0" maxOccurs="unbounded" name="echo" type="s:string" /> wenn dir das mal begnet.. sei gewarnt, weil PHP dir das object mit 1 "echo" anders zurueckgibt als mit 2 "echo"`s einmal duerfte es etwa so aussehn: param->echo und einmal param[0]->echo param[1]->echo d.h. wenn er nur 1 element hat gibt er diese auch nicht als array wieder auch wenn es so definiert ist! keine ahnung ob das n "bug" von php ist oder ob das in allen programmiersprachen so ist... bei dem mist hab ich jedenfalls auch schon ne menge nerven liegen lassen Zitieren
Dennis Xx Geschrieben 18. Dezember 2009 Geschrieben 18. Dezember 2009 genau das gleiche Problem hatte ich ebend auch. Sobald in der Schemdefinition eines Elements maxOccurs="unbounded" angegeben ist und es wird nur ein Element bei Reqeust als Parameter abgeschickt, dann wird das Element bei der Anfrage als Objekt behandelt. Sobald ich mehrere gleiche Elemente als Requestparameter abschicke wird es als Array behandelt. Hmmm merkwürdig, aber scheint wohl normal zu sein. Es sei denn einer hat es anders gelöst und es besteht auch die Möglichkeit, dass die Angabe eines Elementes als Array behandelt wird. Gruß Dennis Zitieren
T3D Geschrieben 18. Dezember 2009 Geschrieben 18. Dezember 2009 du machst einfach if(!is_array($obj)) { $obj = array($obj) }[/PHP] ne generelle funktion gibts da leider ned fuer... aber maybe aendert sich das ja in php6 *traeum* Ted Zitieren
Dennis Xx Geschrieben 19. Dezember 2009 Geschrieben 19. Dezember 2009 Danke für den Tipp, genauso habe ich es auch gelöst... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.