Exemples d'utilisation de SoapClient en PHP

Habdul Hazeez 11 décembre 2023
  1. Obtenir les fonctions et les types d’un service Web en PHP
  2. PHP SOAP Exemple 1 : Conversion de température
  3. PHP SOAP Exemple 2 : Dites bonjour
  4. PHP SOAP Exemple 3 : Arithmétique simple
  5. PHP SOAP Exemple 4 : Informations sur le pays
  6. PHP SOAP Exemple 5 : Conversion de température avec NuSOAP
  7. Exemple bonus : appel SOAP avec cURL
Exemples d'utilisation de SoapClient en PHP

Cet article présente six exemples de travail avec des fichiers WSDL à l’aide de PHP SoapClient. Avant cela, nous expliquerons comment vous pouvez obtenir la fonction et les types à partir d’un service Web.

Ceci est indispensable si vous souhaitez utiliser le service Web.

Obtenir les fonctions et les types d’un service Web en PHP

La première chose que vous devez faire avant d’utiliser un service Web est de connaître ses fonctions et ses types. En effet, une fonction de service renverra des données à partir du service.

Et le type est le type de données des arguments que vous pourriez fournir à la fonction. Nous disons pourrait car, comme vous le découvrirez plus tard, toutes les fonctions de service ne nécessitent pas d’argument.

En PHP, vous pouvez utiliser ce qui suit pour obtenir les fonctions et les types d’un service. Remplacez l’URL du service par une autre et PHP renverra les noms et les types des fonctions.

Vous devez être connecté à Internet pour que le code fonctionne.

<?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>";
?>

Sortie (ce qui suit est un extrait):

<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;
}"
..........

Noter:

  1. Sous types, vous trouverez le type de données des paramètres définis pour une fonction.
  2. Le type de données doit être le même lorsque vous fournissez des arguments à la fonction dans votre code.
  3. Si vous voyez quelque chose comme int intA dans une définition de type, les arguments doivent être un entier nommé intA.

Maintenant que vous savez comment obtenir une fonction et un type de service, vous pouvez commencer à travailler avec un service.

PHP SOAP Exemple 1 : Conversion de température

W3schools fournit un fichier WSDL de convertisseur de température. Depuis PHP, vous pouvez vous connecter à ce fichier pour effectuer une conversion de température.

Les étapes à suivre pour cela (et d’autres opérations SOAP avec SoapClient) sont les suivantes :

  • Créez un nouvel objet SoapClient.
  • Définissez les données avec lesquelles vous aimerez travailler. Ces données doivent être dans un format compatible avec la fonction du service.
  • Appelez la fonction du service.
  • Montrez les résultats.

Nous avons implémenté ces étapes dans le code suivant.

<?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>";
?>

Production:

<pre>object(stdClass)#2 (1) {
  ["CelsiusToFahrenheitResult"]=>
  string(2) "77"
}
</pre><pre>object(stdClass)#3 (1) {
  ["FahrenheitToCelsiusResult"]=>
  string(17) "-3.88888888888889"
}
</pre>

PHP SOAP Exemple 2 : Dites bonjour

Notre deuxième exemple est un message say hello utilisant learnwebservices.com. Tout ce que vous avez à faire est de lancer un appel SOAP au service en utilisant SoapClient.

Ensuite, appelez sa méthode SayHello et transmettez le nom souhaité. Ensuite, vous pouvez accéder à la méthode Message pour afficher le message.

Le message devrait être Hello your_desired_name!. Par exemple, si your_desired_name est Martinez, vous obtiendrez en sortie Hello Martinez!.

C’est ce que nous avons fait dans le code suivant.

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

Production:

Hello Martinez!

PHP SOAP Exemple 3 : Arithmétique simple

Dans cet exemple, nous utilisons un service Web qui vous permet d’effectuer des opérations arithmétiques simples. Cette arithmétique comprend l’addition, la division, la multiplication et la soustraction.

Cependant, nous ne montrerons que comment additionner et diviser à l’aide du service. Vous devriez essayer le reste car cela vous donnera une meilleure compréhension du service.

Les fonctions arithmétiques de ce service nécessitent que les nombres aient un nom. Ces noms sont intA et intB, nous attribuons donc ces noms aux nombres dans un tableau associatif pour faciliter la tâche.

Ensuite, nous passons ce tableau aux fonctions Add et Divide du service. Le code suivant montre tout cela en action et les résultats du calcul.

<?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>";
?>

Production:

<pre>object(stdClass)#2 (1) {
  ["AddResult"]=>
  int(332)
}
object(stdClass)#3 (1) {
  ["DivideResult"]=>
  int(2)
}
</pre>

PHP SOAP Exemple 4 : Informations sur le pays

Si vous souhaitez obtenir certains détails sur un pays, le service de cet exemple est fait pour vous. Le service a de nombreuses fonctions qui renverront les détails d’un pays.

Certaines de ces fonctions sont ListOfCountryNameByCodes et ListOfContinentsByName. Dans ce qui suit, nous utilisons ListOfCountryNameByCodes pour imprimer les pays du monde.

<?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>";
?>

Sortie (ce qui suit est un extrait):

<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 Exemple 5 : Conversion de température avec NuSOAP

NuSOAP est un outil PHP qui vous permet d’établir des connexions SOAP à un service Web. Le mode de fonctionnement est similaire à l’utilisation d’un SoapClient, mais avec la différence suivante.

  1. Le nusoap_client nécessite l’adresse du service et wsdl comme arguments.
  2. Les données sur lesquelles vous allez travailler doivent être en XML.

Pour utiliser NuSOAP, téléchargez-le depuis SourceForge et déposez-le dans votre répertoire de travail actuel. Utilisez ensuite le code suivant pour la conversion de température.

Vous observerez que les étapes sont les mêmes, à l’exception détaillée précédemment. Encore une chose, le code fonctionne en PHP5, et il renvoie bool en PHP8.

<?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>";
?>

Production:

<pre>86 Celsius => 186.8 Fahrenheit</pre>

Exemple bonus : appel SOAP avec cURL

Vous pouvez utiliser cURL pour effectuer un appel SOAP vers un service Web. Encore une fois, nous utiliserons le service de conversion de température W3Schools.

Pendant ce temps, avec cURL, vous devez faire ce qui suit lorsque vous travaillez avec un service.

  1. Les données doivent être dans une Soap Envelope.
  2. Vous devez envoyer des en-têtes de contenu au navigateur.
  3. Vous devez définir les options de connexion cURL.

Nous faisons tout cela et plus encore dans le code suivant ; les commentaires de code détaillent ce qui se passe à chaque étape.

<?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';
?>

Sortie (dans le navigateur) :

56 Celsius => 132.8 Fahrenheit

Résultat (version détaillée) :

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