![]() | HTMLWorld: Home | Hier werben | Impressum | |
|
|
|
|
|
|
|
PHP-Beispiele: SOAP mit PHPvon Michael Stöckel Einführung in SOAP
|
| Parameter | Default-Wert | Bedeutung |
|---|---|---|
| soap.wsdl_cache_enabled | 1 | aktiviert oder deaktiviert den WSDL-Cache |
| soap.wsdl_cache_dir | /tmp | Verzeichnis für den WSDL-Cache |
| soap.wsdl_cache_ttl | 86400 | Zeitraum in Sekunden wie lange zwischengespeicherte WSDL-Dateien genutzt werden sollen |
| soap.wsdl_cache_limit | 5 | maximale Anzahl von WSDL-Dateien, die gespeichert werden können |
Die Nutzung von WSDL ist bei SOAP nicht zwingend notwendig. Das bedeutet, dass man die Parameter in der php.ini nur dann verändern sollte, wenn man auch mit WSDL arbeiten möchte.
Die SOAP-Programmierung wird bei PHP objektorientiert realisiert. Das bedeutet, dass zuerst eine Instanz für ein SOAP-Client-Objekt angelegt werden muss. Dies geschieht durch den folgenden Code:
$soap = new SoapClient(
null,
array(
"location" => "http://localhost/soap/soapserver.php",
"uri" => "http://test-uri",
"soap_version" => SOAP_1_1,
"trace" => 1
)
);
Bei den Parameternfür die Objekt-Instanz kommt es darauf an, ob mit WSDL gearbeitet werden soll oder nicht. Es ist üblich, in der Entwicklung auf WSDL zu verzichten, um sich nicht um ein weiteres Feature kümmern zu müssen. Wenn also kein WSDL-File benötigt wird, muss stattdessen das "null" als Parameter (siehe Beispiel) angegeben werden. Wenn das der Fall ist, ist es gleichzeitig notwendig, alle benötigten Parameter in einem assoziativen Array anzugeben. In der folgenden Tabelle werden die wichtigsten Parameter sowie deren Bedeutung und Priorität aufgelistet.
| Parameter | Bedeutung | Priorität |
|---|---|---|
| location | Ort des SOAP-Server-Skriptes | notwendig |
| uri | Namespace des SOAP-Service | notwendig |
| soap_version | Eingesetzte Protokollversion | optional |
| login | Loginname für HTTP-Authenifizierung | optional |
| password | Passwort für HTTP-Authenifizierung | optional |
| compression | Komprimierung des SOAP-Requests | optional |
| encoding (*) | Zeichensatz für SOAP-Request | optional |
| trace | Möglichkeit zur Analyse des SOAP-Requests | optional |
| local_cert | Zertifikatspfad für SSL-Kommunikation | optional |
| proxy_host | Ort des Proxy-Servers | optional |
| proxy_port | IP-Port des Proxy-Servers | optional |
| proxy_login | Login für den Proxy-Server | optional |
| proxy_password | Passwort für den Proxy-Server | optional |
(*) Dabei wird nicht der Zeichensatz des SOAP-Requests verändert. Dafür wird grundsätzlich UTF-8 verwendet. Dieser Parameter beeinflusst die Darstellung der übermittelten Nutzer-Informationen.
Nach dem Anlegen der Objektinstanz für den SOAP-Client müssen die Aufrufe für die Funktionen des SOAP-Servers festgelegt werden. Dazu gibt es zwei Möglichkeiten, die der Programmierer frei nach seinem Willen einsetzen kann.
Die einfachere Variante ist ein Funktionsaufruf nach dem üblichen Prinzip, wie die Methode eines Objektes in PHP aufgerufen wird. Der folgende Code zeigt ein entsprechendes Beispiel:
$result= $soap->testfunktion("Michael");
Damit wird auf dem Server die Funktion "testfunktion", der der Parameter "Michael" übergeben wird, aufgerufen. Es steht dem Programmierer frei, ob er die Parameter als Array oder einzeln übergibt. In der Variable $result ist der Rückgabewert enthalten, wobei automatisch ermittelt wird, ob es sich um eine Variable oder um ein Array handelt.
Eine Alternative für den Funktionsaufruf ist die Funktion __soapCall, die mit der SOAP-Extension mitgeliefert wird. Wenn diese Funktion verwendet wird, müssen die Parameter zwingend als Array übergeben werden. Der folgende Codeausschnitt zeigt ein Anwendungsbeispiel:
$result = $soap->__soapCall("testfunktion", array("Michael"));
Hier entspricht der Funktionsname einem übergebenen Parameter. Ansonsten gibt es keinen weiteren Unterschied zur ersten Alternative.
Der Programmierer hat verschiedene Möglichkeiten, dass bei einem SOAP-Request ein Fehler auftreten kann. Die zwei gängigsten Beispiele sind ein Schreibfehler beim Funktionsnamen oder beim Pfad zum Serverskript, so dass der Request ins Leere geht. Die PHP-SOAP-Extension bietet mehrere Funktionen, um sich einen aufgetretenen Fehler anzeigen und analysieren lassen zu können.
Es empfiehlt sich auf jeden Fall die Funktion is_soap_fault() zu verwenden, denn damit kann überprüft werden, ob ein Fehlerfall vorliegt oder nicht. Im Zusammenhang mit einer trivialen if-Schleife ist diese Funktion am sinnvollsten eingesetzt.
if(is_soap_fault($result))
{
print(" Fehlercode: $result->faultcode | Fehlerstring:
$result->faultstring");
}
else
{
print "$result<br>";
}
Die Funktion bezieht sich immer auf einem bestimmten Funkionsaufruf, so dass als Parameter der Rückgabewert des entsprechenden Aufrufes mit übergeben werden muss. Wenn die Bedingung if(is_soap_fault($result)) erfüllt ist, wird die Fehlermeldung ausgegeben. Die Fehlermeldungen können in unterschiedlicher Art und Weise ermittelt werden, wofür standardmäßig die Methoden zur Verfügung gestellt werden. Mit der Eigenschaft faultcode wird ein SOAP-Fehlercode angezeigt, der alleine noch nicht aussagekräftig ist. Die Eigenschaft faultstring liefert eine ausführliche Beschreibung zum Fehlercode. Die Eigenschaft faultactor gibt einen Hinweis zurück, bei welcher Komponente, die der SOAP-Request durchlaufen hat, der Fehler aufgetreten ist.
Wen das noch nicht zufrieden stellt, kann mit der Funktion trigger_error() auch eigene Fehlermeldungen generieren. Dazu muss neben dem eigenen Fehlertext noch die PHP-Kategorie, die in diesem Fall "E_USER_ERROR" lautet, angegeben werden.
Nachdem der SOAP-Client fertig ist, muss nun das Skript für den SOAP-Server programmiert werden. Auch hier muss zuerst die Instanz für ein Serverobjekt angelegt werden, was durch folgenden Code realisiert werden kann:
$server = new SoapServer(
null,
array(
'uri'=>"http://localhost/test-uri",
'encoding'=>'UTF-8',
'soap_version'=>SOAP_1_2
)
);
Auch beim Server gibt man als ersten Parameter entweder die WSDL-Datei oder das NULL an, wenn nicht mit WSDL gearbeitet werden soll. Alle weiteren Parameter müssen zwingend als assoziatives Array mit angegeben werden. In der folgenden Tabelle werden die gängigsten Parameter für das Serverobjekt beschrieben.
| Parameter | Bedeutung | Priorität |
|---|---|---|
| uri | Namespace des SOAP-Service | notwendig wenn WSDL nicht genutzt wird |
| soap_version | Eingesetzte Protokollversion | optional |
| encoding | Zeichensatz für SOAP-Request | optional |
Speziell bei der Angabe der URI sollte man aufpassen, dass die Information beim Serverobjekt mit der Angabe beim Clientobjekt übereinstimmt. Um dieses zu verdeutlichen, werden die beiden Angaben verglichen.
Client: "uri" => "http://test-uri"
Server: "uri" => "http://localhost/test-uri"
Hinweis: Eine weitere typische Fehlerquelle bei SOAP-Anwendungen ist die Nicht-Übereinstimmung der Definitionen für den Namespace.
Der gedankliche Ausgangspunkt ist, dass zum jetzigen Zeitpunkt der SOAP-Request von Client mit allen notwendigen Informationen (Funktionsnamen, Parameter) angekommen ist. Jetzt muss dem Server mitgeteilt werden, dass er den Request auch ausführen soll. Das bedeutet, er muss die entsprechende Funktion aufrufen, die Informationen für die Response ermitteln und eine Antwort zum Client zurückschicken. Diese Aufgaben übernimmt pauschal die Funktion handle(), die im Server-Skript ohne weiteren Parameter angegeben werden muss.
$server->handle();
Die Informationen für den SOAP-Client können innerhalb des Servers über Funktionen oder Klassen ermittelt werden. Dafür gilt das allgemeine Prinzip, dass die Funktionen bzw. Klassen zum Server hinzugefügt werden müssen. Manchmal taucht auch die Formulierung auf, dass die Funktionen/Klassen beim Server registriert werden müssen. Um diese Aufgabe zu erfüllen, gibt es zwei Funktionen - addFunction() für die Funktion(en) und setClass() für die Klasse(n).
$server->addFunction("testfunktion");
In diesem Beispiel wird die Funktion testfunktion dem SOAP-Server hinzugefügt. Eine Angabe der Parameter für die Funktion ist nicht erforderlich. Mit addFunction können mehrere Funktionen gleichzeitig registriert werden. Wenn dies genutzt werden soll, müssen die einzelnen Funktionsnamen als Elemente eines Arrays mit angegeben werden.
Das Hinzufügen einer Klasse wird durch das folgende Codebeispiel realisiert:
$server->setClass("testklasse", $param1, $param2);
Obwohl es möglich ist, besteht keine Notwendigkeit, die Parameter mit anzugeben.
Hinweis: Mit der Funktion setPersistence() kann man anderen Skripten oder Sessions erlauben, auf die Klasse im SOAP-Server zuzugreifen.
Zur Ermittlung der Informationen im Server können Klassen oder Funktionen verwendet werden. Beides wird nach dem bekannten Prinzipien definiert und ganz einfach mit im Serverskript angegeben. Der folgende Code zeigt ein Beispiel für die Definition einer Funktion:
function testfunktion($param)
{
return "Hallo" . $param . "!! Es funktioniert!!!";
}
Über die handle()-Funktion wird der Parameter an die Funktion übergeben und kann innerhalb der Funktion nach dem üblichen Prinzip verarbeitet werden. Um die Information für die Antwort des Servers bereitzustellen, muss diese mit dem Schlüsselwort return wieder zurückgegeben werden.
|
|
| « zurück | weiter » |
| Achtung: Seite ist nicht mehr gültig von Sir Quicksand | |
| Undefined variable - bitte um Hilfe von A235 | |
| Navigation Link soll ausgewählt bleiben von Maxxon | |
| Zeitliche Zugriffsbegrenzung auf eine Webseite von Krueger008 | |
| Suche in einer Spalte Datenbank mit Ausgabe als Link von xmen | |
| php frage von cyborg | |
| Welchen Befehl? von duesseltalker | |
| Mail vom Kontaktformular ist leer von promo | |
| Formular wird alphabetisch sortiert, statt logisch von gooddog | |
| Bekomme Validierung von Style.css.php nicht in den Griff !? von OneMoreMedia |
PHP-Beispiele
| Autor: | Jan Winkler | ||
| Bewertung: | |||
| Community: | 586 Beiträge im PHP-Beispiele Forum |
Navigation
| Achtung: Seite ist nicht mehr gültig von Sir Quicksand | ||
| Undefined variable - bitte um Hilfe von A235 | ||
| Navigation Link soll ausgewählt bleiben von Maxxon | ||
| Zeitliche Zugriffsbegrenzung auf eine Webseite von Krueger008 | ||
| Suche in einer Spalte Datenbank mit Ausgabe als Link von xmen | ||
| php frage von cyborg | ||
| Welchen Befehl? von duesseltalker | ||
| Mail vom Kontaktformular ist leer von promo | ||
| Formular wird alphabetisch sortiert, statt logisch von gooddog | ||
| Bekomme Validierung von Style.css.php nicht in den Griff !? von OneMoreMedia | ||
| Seiteninhalt über ID's ändern ? von Alex... | ||
| Custom tailor made sites to suit your business requirement. von acumencs | ||
| Struktur von php-Dateien in wordpress von Iago | ||
| Extension:LDAP Authentication von sternkopf | ||
| Warnung bzw. Fehlermeldung von rallaf |
|
|
|
|
|
|
Startseite | Kontakt | Über uns | Impressum | Datenschutz | Was sind das für grüne Links? Unsere Angebote: HTML World | Downloads World | IT-News World | HSDPA World | Traveling World | Weather World | HSDPA | Internet Stick |