Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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 :P

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 :D

Geschrieben

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

Geschrieben

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

Geschrieben

: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

Geschrieben

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) { }

Geschrieben
: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 :P

ich geb dir einfach mal mein komplettes test-client-script, glaube das ist die einfachste variante :D


<?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!

Geschrieben

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

Geschrieben

$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 :P

Geschrieben (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 von jasso
Geschrieben

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 :D

<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 :D

  • 8 Monate später...
Geschrieben

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

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...