Cómo consumir un WebService SOAP con PHP

Qué son los WebServices

Los WebServices son un mecanismo muy útil para integrar aplicaciones a través del protocolo HTTP, y de ese modo, aprovechar las capacidades de terceros dentro de nuestras propias aplicaciones.

Un ejemplo muy común es de las pasarelas de pago, como ser PayPal o MercadoPago.

Se basan siempre en la existencia de dos procesos:

  • El cliente (Consumidor)
  • El servidor (Productor)

A nivel técnico existen dos operaciones que pueden realizarse a través de WebServices:

  1. Consumirlos
  2. Exponerlos

Uno de los protocolos que pueden utilizar los WebServices es SOAP (Otro muy común es REST).

Consumirlos usando PHP es bastante simple, para ello se utiliza la clase SoapClient.

Ejemplo de consulta de localización basado en IP

Para este ejemplo usaremos el WebService de cdyne.com para obtener información geográfica en base a la IP buscada.

<?php

$url = "http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl";

try {
 $client = new SoapClient($url, [ "trace" => 1 ] );
 $result = $client->ResolveIP( [ "ipAddress" => $argv[1], "licenseKey" => "0" ] );

 print_r($result);
} catch ( SoapFault $e ) {
 echo $e->getMessage();
}


echo PHP_EOL;

En este caso, este script debería ser corrido desde CLI.

Por ejemplo, si lo guardás como «ws.php», al ejecutar php ws.php 210.45.151.101 obtendrás la salida:

stdClass Object
(
 [ResolveIPResult] => stdClass Object
 (
 [City] => Huainan
 [StateProvince] => 01
 [Country] => China
 [Organization] => 
 [Latitude] => 32.6264
 [Longitude] => 116.9969
 [AreaCode] => 0
 [TimeZone] => 
 [HasDaylightSavings] => 
 [Certainty] => 90
 [RegionName] => 
 [CountryCode] => CN
 )
)

Como podrás observar, la respuesta del método ResolveIP es un objeto de tipo StdClass.

StdClass es una clase genérica de PHP (Algo medio raro y, casi diría que un abuso de la naturaleza interpretada del lenguaje). Esta clase no tiene métodos ni propiedades definidas, pero sirve como una especie de contenedor al que se le puede asignar arbitrariamente todo lo que uno quiera (En rigor de verdad, esto puede hacerse con cualquier clase de PHP, sólo que es preferible no hacerlo).

Básicamente, al construir el cliente a partir de la definición de un WSDL están disponibles todos los servicios expuestos como métodos propios (como si estuviesen accesibles en forma local, a pesar de que la verdadera llamada es remota).

Es interesante notar esto, si ves la línea $result = $client->ResolveIP( [ "ipAddress" => $argv[1], "licenseKey" => "0" ] ); podrás notar que se está invocando al método ResolveIP sobre un objeto de clase SoapClient.

La clase SoapClient es una clase estándar de PHP, mientras que el método ResolveIP sólo tiene sentido dentro de este WebService. Si te estás preguntando cómo puede una clase estándar reconocer métodos desconocidos te diría que deberías darle una mirada al tema de los métodos mágicos de PHP (O tomar el curso de PHP Orientado a Objetos).

Como te imaginarás, si existe la clase SoapClient… debe existir la clase SoapServer (Tema de otro post).

En el curso de PHP WebServices estudiamos este tema en mayor profundidad, mientras tanto, si te quedó alguna duda podés dejarla en un comentario.

mchojrin

Docente y consultor PHP at Leeway Academy
Ayudo a desarrolladores PHP a acelerar su llegada a Sr.

5 comentarios en “Cómo consumir un WebService SOAP con PHP

  • Daniel Valenzuela

    Hola muchas gracias por la explicacion, tengo una duda como se podria obtener el valor por ejemplo de [City] => Huainan este ultimo Huainan, estoy trabajando con un ejemplo similar pero no este caso

    saludos

    • Hola Daniel:

      Gracias por tu pregunta. Muy acertada por cierto :).

      Voy a modificar el artículo para que quede más claro, mientras tanto, la forma de acceder a la campo City sería:

      echo $result->ResolveIPResult->City;

      Esto funciona así porque $result es un objeto de clase StdClass (La clase «genérica» de PHP), si te fijas la salida del print_r notarás que tiene una propiedad que se llamana ResolveIPResult (también de clase StdClass) que tiene una propiedad City, en este caso Huainan.

      Puedes leer más sobre StdClass en el sitio de php.net: http://php.net/manual/es/reserved.classes.php.

      ¿Me expliqué correctamente?

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: