Beispiele zur Verwendung des SoapClient in PHP

Habdul Hazeez 11 Dezember 2023
  1. Funktionen und Typen von einem Webdienst in PHP abrufen
  2. PHP SOAP Beispiel 1: Temperaturkonvertierung
  3. PHP SOAP Beispiel 2: Sag Hallo
  4. PHP SOAP Beispiel 3: Einfache Arithmetik
  5. PHP SOAP Beispiel 4: Länderinformationen
  6. PHP SOAP Beispiel 5: Temperaturumrechnung mit NuSOAP
  7. Bonusbeispiel: SOAP-Aufruf mit cURL
Beispiele zur Verwendung des SoapClient in PHP

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:

  1. Unter types finden Sie den Datentyp der für eine Funktion definierten Parameter.
  2. Der Datentyp muss derselbe sein, wenn Sie der Funktion in Ihrem Code Argumente zuführen.
  3. Wenn Sie etwas wie int intA in einer Typdefinition sehen, müssen die Argumente eine Ganzzahl namens intA 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.

  1. Der nusoap_client benötigt als Argumente die Dienstadresse und wsdl.
  2. 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.

  1. Die Daten sollten sich in einem Soap Envelope befinden.
  2. Sie müssen Inhaltsheader an den Browser senden.
  3. 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 avatar Habdul Hazeez avatar

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