Beispiele zur Verwendung des SoapClient in PHP
- Funktionen und Typen von einem Webdienst in PHP abrufen
- PHP SOAP Beispiel 1: Temperaturkonvertierung
- PHP SOAP Beispiel 2: Sag Hallo
- PHP SOAP Beispiel 3: Einfache Arithmetik
- PHP SOAP Beispiel 4: Länderinformationen
-
PHP SOAP Beispiel 5: Temperaturumrechnung mit
NuSOAP
-
Bonusbeispiel: SOAP-Aufruf mit
cURL
Dieser Artikel stellt sechs Beispiele für die Arbeit mit WSDL-Dateien mit PHP SoapClient
vor. Zuvor erklären wir, wie Sie die Funktion und Typen von einem Webdienst erhalten können.
Dies ist ein Muss, wenn Sie den Webservice nutzen möchten.
Funktionen und Typen von einem Webdienst in PHP abrufen
Das erste, was Sie tun müssen, bevor Sie einen Webdienst verwenden, ist, seine Funktionen und Typen zu kennen. Das liegt daran, dass eine Dienstfunktion Daten vom Dienst zurückgibt.
Und der Typ ist der Datentyp von Argumenten, die Sie möglicherweise an die Funktion liefern. Wir sagen könnte, weil, wie Sie später herausfinden werden, nicht alle Dienstfunktionen ein Argument erfordern.
In PHP können Sie Folgendes verwenden, um die Funktionen und Typen von einem Dienst abzurufen. Ersetzen Sie die Dienst-URL durch eine andere, und PHP gibt die Namen und Typen der Funktionen zurück.
Sie sollten mit dem Internet verbunden sein, damit der Code funktioniert.
<?php
$client = new SoapClient("http://www.dneonline.com/calculator.asmx?WSDL");
echo "<b>The functions are:</b> <br/>";
echo "<pre>";
var_dump($client->__getFunctions());
echo "</pre>";
echo "<b>The types are:</b> <br />";
echo "<pre>";
var_dump($client->__getTypes());
echo "</pre>";
?>
Ausgabe (hier ein Auszug):
<b>The functions are:</b> <br/><pre>array(8) {
[0]=>
string(32) "AddResponse Add(Add $parameters)"
[1]=>
string(47) "SubtractResponse Subtract(Subtract $parameters)"
[2]=>
string(47) "MultiplyResponse Multiply(Multiply $parameters)"
[3]=>
string(41) "DivideResponse Divide(Divide $parameters)"
[4]=>
string(32) "AddResponse Add(Add $parameters)"
[5]=>
string(47) "SubtractResponse Subtract(Subtract $parameters)"
[6]=>
string(47) "MultiplyResponse Multiply(Multiply $parameters)"
[7]=>
string(41) "DivideResponse Divide(Divide $parameters)"
}
</pre><b>The types are:</b> <br /><pre>array(8) {
[0]=>
string(36) "struct Add {
int intA;
int intB;
}"
[1]=>
string(38) "struct AddResponse {
int AddResult;
}"
[2]=>
string(41) "struct Subtract {
int intA;
int intB;
}"
..........
Notiz:
- Unter
types
finden Sie den Datentyp der für eine Funktion definierten Parameter. - Der Datentyp muss derselbe sein, wenn Sie der Funktion in Ihrem Code Argumente zuführen.
- Wenn Sie etwas wie
int intA
in einer Typdefinition sehen, müssen die Argumente eine Ganzzahl namensintA
sein.
Nachdem Sie nun wissen, wie Sie eine Dienstfunktion und einen Diensttyp abrufen, können Sie mit der Arbeit mit einem Dienst beginnen.
PHP SOAP Beispiel 1: Temperaturkonvertierung
W3schools stellt eine WSDL-Datei für den Temperaturkonverter bereit. Von PHP aus können Sie eine Verbindung zu dieser Datei herstellen, um eine Temperaturkonvertierung durchzuführen.
Die Schritte dafür (und andere SOAP-Operationen mit SoapClient
) sind wie folgt:
-
Erstellen Sie ein neues
SoapClient
-Objekt. -
Definieren Sie die Daten, mit denen Sie arbeiten möchten. Diese Daten sollten in einem Format vorliegen, mit dem die Funktion des Dienstes arbeiten kann.
-
Rufen Sie die Funktion des Dienstes auf.
-
Zeigen Sie die Ergebnisse.
Wir haben diese Schritte im folgenden Code implementiert.
<?php
// Create the client object and pass in the
// URL of the SOAP server.
$soap_client = new SoapClient('https://www.w3schools.com/xml/tempconvert.asmx?WSDL');
// Create an associative array of the data
// that you'll pass into one of the functions
// of the client.
$degrees_in_celsius = array('Celsius' => '25');
// Use a function of the client for the
// conversion.
$convert_to_fahrenheit = $soap_client->CelsiusToFahrenheit($degrees_in_celsius);
// Show the result using var_dump. Other PHP
// functions like echo will not work.
echo "<pre>";
var_dump($convert_to_fahrenheit);
echo "</pre>";
// Repeat the same process. This time, use the
// FahrenheitToCelsius function to convert a
// temperature from Fahrenheit to Celsius.
$degrees_in_fahrenheit = array('Fahrenheit' => '25');
$convert_to_celsius = $soap_client->FahrenheitToCelsius($degrees_in_fahrenheit);
echo "<pre>";
var_dump($convert_to_celsius);
echo "</pre>";
?>
Ausgabe:
<pre>object(stdClass)#2 (1) {
["CelsiusToFahrenheitResult"]=>
string(2) "77"
}
</pre><pre>object(stdClass)#3 (1) {
["FahrenheitToCelsiusResult"]=>
string(17) "-3.88888888888889"
}
</pre>
PHP SOAP Beispiel 2: Sag Hallo
Unser zweites Beispiel ist eine “say hello”-Nachricht mit learnwebservices.com
. Alles, was Sie tun müssen, ist, mit SoapClient
einen SOAP-Aufruf an den Dienst zu initiieren.
Rufen Sie danach die Methode SayHello
auf und geben Sie Ihren gewünschten Namen ein. Dann können Sie auf die Methode Message
zugreifen, um die Nachricht anzuzeigen.
Die Nachricht sollte Hello your_desired_name!
lauten. Wenn beispielsweise your_desired_name
Martinez
ist, erhalten Sie als Ausgabe Hello Martinez!
.
Dies haben wir im nächsten Code getan.
<?php
$soap_client = new SoapClient('https://apps.learnwebservices.com/services/hello?wsdl');
// Call a function of the soap client.
$say_hello = $soap_client->SayHello(['Name' => 'Martinez']);
// Print the message from the client.
echo $say_hello->Message;
?>
Ausgabe:
Hello Martinez!
PHP SOAP Beispiel 3: Einfache Arithmetik
In diesem Beispiel verwenden wir einen Webdienst, mit dem Sie einfache Arithmetik ausführen können. Solche Arithmetik umfasst Addition, Division, Multiplikation und Subtraktion.
Wir zeigen jedoch nur, wie man mithilfe des Dienstes addiert und dividiert. Sie sollten den Rest ausprobieren, da er Ihnen ein besseres Verständnis des Dienstes vermittelt.
Die Rechenfunktionen dieses Dienstes erfordern, dass die Zahlen einen Namen haben. Diese Namen sind intA
und intB
, also ordnen wir diese Namen den Zahlen in einem assoziativen Array zu, um es einfacher zu machen.
Anschließend übergeben wir dieses Array an die Funktionen Add
und Divide
des Dienstes. Der folgende Code zeigt all dies in Aktion und die Berechnungsergebnisse.
<?php
// Connect to a SOAP client that allows you
// to do basic calculations.
$soap_client = new SoapClient("http://www.dneonline.com/calculator.asmx?WSDL");
// Define data that'll use with the client. This
// time the client requires that arguments that
// you'll pass in has the name intA and intB.
// Therefore, we use that name in our array.
$numbers_for_the_client = array("intA" => 222, "intB" => 110);
$add_the_numbers = $soap_client->Add($numbers_for_the_client);
$divide_the_numbers = $soap_client->Divide($numbers_for_the_client);
// Show the results of the addition and
// division of numbers.
echo "<pre>";
var_dump($add_the_numbers);
var_dump($divide_the_numbers);
echo "</pre>";
?>
Ausgabe:
<pre>object(stdClass)#2 (1) {
["AddResult"]=>
int(332)
}
object(stdClass)#3 (1) {
["DivideResult"]=>
int(2)
}
</pre>
PHP SOAP Beispiel 4: Länderinformationen
Wenn Sie bestimmte Details zu einem Land abrufen möchten, ist der Dienst in diesem Beispiel genau das Richtige für Sie. Der Dienst hat viele Funktionen, die Details zu einem Land zurückgeben.
Einige dieser Funktionen sind ListOfCountryNameByCodes
und ListOfContinentsByName
. Im Folgenden verwenden wir ListOfCountryNameByCodes
, um die Länder der Welt auszudrucken.
<?php
// A soap client that allows you to view information
// about countries in the world
$soap_client = new SoapClient("http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL");
// Use a client function to print country names.
$list_countries_names_by_code = $soap_client->ListOfCountryNamesByCode();
/*
Here is another function you can try out.
$list_of_continents_by_name = $client->ListOfContinentsByName();
*/
// Show the results.
echo "<pre>";
var_dump($list_countries_names_by_code);
echo "</pre>";
?>
Ausgabe (hier ein Auszug):
<pre>object(stdClass)#2 (1) {
["ListOfCountryNamesByCodeResult"]=>
object(stdClass)#3 (1) {
["tCountryCodeAndName"]=>
array(246) {
[0]=>
object(stdClass)#4 (2) {
["sISOCode"]=>
string(2) "AD"
["sName"]=>
string(7) "Andorra"
}
[1]=>
object(stdClass)#5 (2) {
["sISOCode"]=>
string(2) "AE"
["sName"]=>
string(20) "United Arab Emirates"
}
[2]=>
object(stdClass)#6 (2) {
["sISOCode"]=>
string(2) "AF"
["sName"]=>
string(11) "Afghanistan"
}
....
PHP SOAP Beispiel 5: Temperaturumrechnung mit NuSOAP
NuSOAP
ist ein PHP-Tool, mit dem Sie SOAP-Verbindungen zu einem Webdienst herstellen können. Die Funktionsweise ist wie bei einem SoapClient
, jedoch mit folgendem Unterschied.
- Der
nusoap_client
benötigt als Argumente die Dienstadresse undwsdl
. - Die Daten, an denen Sie arbeiten, müssen in XML vorliegen.
Um NuSOAP
zu verwenden, laden Sie es von SourceForge
herunter und legen Sie es in Ihrem aktuellen Arbeitsverzeichnis ab. Verwenden Sie dann den folgenden Code für die Temperaturumrechnung.
Sie werden feststellen, dass die Schritte identisch sind, mit der zuvor beschriebenen Ausnahme. Eine weitere Sache, der Code funktioniert in PHP5
und gibt bool
in PHP8
zurück.
<?php
// This PHP script use NUSOAP for SOAP connection
// and it works in PHP5 ONLY.
require_once('nusoap.php');
// Specify the WSDL file and initiate a new
// NUSOAP client.
$wsdl = "https://www.w3schools.com/xml/tempconvert.asmx?WSDL";
$nusoap_client = new nusoap_client($wsdl, 'wsdl');
// Call on the required method of the client.
$function_from_client = "CelsiusToFahrenheit";
// We'll save the result of the entire operation
// in an array.
$result = array();
// Temperature for conversion.
$temperature = 86;
// Specify the temperature as an XML file
$temperature_as_xml= '<CelsiusToFahrenheit xmlns="https://www.w3schools.com/xml/">
<Celsius>' . $temperature . '</Celsius>
</CelsiusToFahrenheit>';
// If the function exists in the client, initiate
// the conversion.
if (isset($function_from_client)) {
$result['response'] = $nusoap_client->call($function_from_client, $temperature_as_xml);
}
// Show the results
echo "<pre>" . $temperature . ' Celsius => ' . $result['response']['CelsiusToFahrenheitResult'] . ' Fahrenheit' . "</pre>";
?>
Ausgabe:
<pre>86 Celsius => 186.8 Fahrenheit</pre>
Bonusbeispiel: SOAP-Aufruf mit cURL
Sie können cURL
verwenden, um einen SOAP-Aufruf an einen Webdienst zu tätigen. Auch hier verwenden wir den Temperaturumrechnungsdienst von W3Schools.
Unterdessen müssen Sie mit cURL
Folgendes tun, wenn Sie mit einem Dienst arbeiten.
- Die Daten sollten sich in einem
Soap Envelope
befinden. - Sie müssen Inhaltsheader an den Browser senden.
- Sie müssen die Verbindungsoptionen
cURL
definieren.
Wir tun all dies und mehr im folgenden Code; Die Codekommentare beschreiben, was bei jedem Schritt vor sich geht.
<?php
// This script allows you to use w3schools
// convert via curl.
$webservice_address = "https://www.w3schools.com/xml/tempconvert.asmx";
// The number you'll like to convert, in this case
// we'll like to convert a temperature in celsius
// fahrenheit.
$temperature = 56;
// Pass the temperature as an XML file.
// The XML format is based on the official
// format for the SOAP client by w3schools.
// You can find more at:
$temperature_as_xml = '<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:soap12="https://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<CelsiusToFahrenheit xmlns="https://www.w3schools.com/xml/">
<Celsius>' . $temperature . '</Celsius>
</CelsiusToFahrenheit>
</soap12:Body>
</soap12:Envelope>';
// Define content headers
$content_headers = array(
'Content-Type: text/xml; charset=utf-8',
'Content-Length: '.strlen($temperature_as_xml)
);
// Initiate the CURL connection and define
// the connection options.
$init_curl_connection = curl_init($webservice_address);
curl_setopt($init_curl_connection, CURLOPT_POST, true);
curl_setopt($init_curl_connection, CURLOPT_HTTPHEADER, $content_headers);
curl_setopt($init_curl_connection, CURLOPT_POSTFIELDS, $temperature_as_xml);
curl_setopt($init_curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($init_curl_connection, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($init_curl_connection, CURLOPT_SSL_VERIFYPEER, false);
// Use the curl_exec function to get the
// received data.
$recieved_data = curl_exec($init_curl_connection);
// Save the connection result in another variable.
// This will allow us to use it in an "if" statement
// without causing ambiguity.
$connection_result = $recieved_data;
// Check if there is an error.
if ($connection_result === FALSE) {
printf("CURL error (#%d): %s<br>\n", curl_errno($init_curl_connection),
htmlspecialchars(curl_error($init_curl_connection)));
}
// Close the CURL connection
curl_close ($init_curl_connection);
// Show the received data.
echo $temperature . ' Celsius => ' . $recieved_data . ' Fahrenheit';
?>
Ausgabe (im Browser):
56 Celsius => 132.8 Fahrenheit
Ausgabe (ausführliche Version):
Celsius => <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://www.w3.org/2003/05/soap-envelope" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<soap:Body>
<CelsiusToFahrenheitResponse xmlns="https://www.w3schools.com/xml/">
<CelsiusToFahrenheitResult>132.8</CelsiusToFahrenheitResult>
</CelsiusToFahrenheitResponse><
/soap:Body></soap:Envelope>Fahrenheit
Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.
LinkedIn