Ejemplos de uso de SoapClient en PHP

Habdul Hazeez 11 diciembre 2023
  1. Obtenga las funciones y tipos de un servicio web en PHP
  2. PHP SOAP Ejemplo 1: Conversión de temperatura
  3. PHP SOAP Ejemplo 2: Di hola
  4. PHP SOAP Ejemplo 3: Aritmética simple
  5. PHP SOAP Ejemplo 4: Información del país
  6. PHP SOAP Ejemplo 5: Conversión de temperatura usando NuSOAP
  7. Ejemplo de bonificación: Llamada SOAP con cURL
Ejemplos de uso de SoapClient en PHP

Este artículo presenta seis ejemplos de trabajo con archivos WSDL utilizando PHP SoapClient. Antes de eso, explicaremos cómo puede obtener la función y los tipos de un servicio web.

Esto es imprescindible si desea utilizar el servicio web.

Obtenga las funciones y tipos de un servicio web en PHP

Lo primero que debes hacer antes de utilizar un servicio web es conocer sus funciones y tipos. Eso es porque una función de servicio devolverá datos del servicio.

Y el tipo es el tipo de datos de los argumentos que puede proporcionar a la función. Decimos podría porque, como descubrirá más adelante, no todas las funciones de servicio requieren un argumento.

En PHP, puede usar lo siguiente para obtener las funciones y tipos de un servicio. Reemplace la URL del servicio con otra y PHP devolverá los nombres y tipos de las funciones.

Debe estar conectado a Internet para que el código funcione.

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

Salida (el siguiente es un extracto):

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

Nota:

  1. En types, encontrará el tipo de datos de los parámetros definidos para una función.
  2. El tipo de datos debe ser el mismo cuando proporciona argumentos a la función en su código.
  3. Si ve algo como int intA en una definición de tipo, los argumentos deben ser un número entero llamado intA.

Ahora que sabe cómo obtener una función y tipo de servicio, puede comenzar a trabajar con un servicio.

PHP SOAP Ejemplo 1: Conversión de temperatura

W3schools proporciona un archivo WSDL convertidor de temperatura. Desde PHP, puede conectarse a este archivo para realizar la conversión de temperatura.

Los pasos a seguir para esta (y otras operaciones SOAP con SoapClient) son los siguientes:

  • Cree un nuevo objeto SoapClient.
  • Defina los datos con los que le gustaría trabajar. Estos datos deben estar en un formato con el que pueda funcionar la función del servicio.
  • Llame a la función del servicio.
  • Mostrar los resultados.

Hemos implementado estos pasos en el siguiente código.

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

Producción :

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

PHP SOAP Ejemplo 2: Di hola

Nuestro segundo ejemplo es un mensaje de say hello utilizando learnwebservices.com. Todo lo que tiene que hacer es iniciar una llamada SOAP al servicio utilizando SoapClient.

Luego, llame a su método SayHello y pase su nombre deseado. Luego puede acceder al método Message para mostrar el mensaje.

El mensaje debe ser Hello your_desired_name!. Por ejemplo, si your_desired_name es Martinez, obtendrás un resultado de Hello Martinez!.

Esto es lo que hemos hecho en el siguiente código.

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

Producción :

Hello Martinez!

PHP SOAP Ejemplo 3: Aritmética simple

En este ejemplo, usamos un servicio web que le permite realizar operaciones aritméticas simples. Tal aritmética incluye suma, división, multiplicación y resta.

Sin embargo, solo mostraremos cómo sumar y dividir usando el servicio. Debe probar el resto porque le dará una mejor comprensión del servicio.

Las funciones aritméticas de este servicio requieren que los números tengan un nombre. Estos nombres son intA e intB, por lo que asignamos estos nombres a los números en un array asociativo para hacerlo más fácil.

Posteriormente, pasamos esta matriz a las funciones Add y Divide del servicio. El siguiente código muestra todo esto en acción y los resultados del cálculo.

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

Producción :

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

PHP SOAP Ejemplo 4: Información del país

Si desea obtener ciertos detalles sobre un país, el servicio de este ejemplo es para usted. El servicio tiene muchas funciones que devolverán los detalles de un país.

Algunas de estas funciones son ListOfCountryNameByCodes y ListOfContinentsByName. A continuación, usamos ListOfCountryNameByCodes para imprimir los países del mundo.

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

Salida (el siguiente es un extracto):

<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 Ejemplo 5: Conversión de temperatura usando NuSOAP

NuSOAP es una herramienta PHP que le permite hacer conexiones SOAP a un servicio web. El modo de operación es como usar un SoapClient, pero con la siguiente diferencia.

  1. El nusoap_client requiere la dirección del servicio y wsdl como argumentos.
  2. Los datos con los que trabajará deben estar en XML.

Para usar NuSOAP, descárguelo de SourceForge y colóquelo en su directorio de trabajo actual. Luego use el siguiente código para la conversión de temperatura.

Observará que los pasos son los mismos, con la excepción detallada anteriormente. Una cosa más, el código funciona en PHP5, y devuelve 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>";
?>

Producción :

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

Ejemplo de bonificación: Llamada SOAP con cURL

Puede utilizar cURL para realizar una llamada SOAP a un servicio web. De nuevo, utilizaremos el servicio de conversión de temperatura de W3Schools.

Mientras tanto, con cURL, debes hacer lo siguiente cuando trabajes con un servicio.

  1. Los datos deben estar en un Sovelope.
  2. Debe enviar encabezados de contenido al navegador.
  3. Debes definir las opciones de conexión cURL.

Hacemos todo esto y más en el siguiente código; los comentarios del código detallan lo que sucede en cada paso.

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

Salida (en el navegador):

56 Celsius => 132.8 Fahrenheit

Salida (versión detallada):

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