Entre píxeles y bytes

Consumiendo servicios SOAP y REST en WordPress

Recientemente he trabajado en un proyecto web en WordPress en que la web tenia que dar acceso a fuentes de información “externas”, en concreto:

  • Acceder a consultar contenidos en otro servidor. Contenidos que se recibian a traves de un API Rest modelados en JSON.
  • Registrar usuarios en un servicio de newsletter propio del cliente, usando un API SOAP

Implementar esto con WordPress no es muy complicado porque detrás no hay más que PHP, pero quiero dejar anotadas algunas cosas.

Para empezar el consumo de estos dos servicios lo desarrolle como plugins de WordPress, de manera que quedaban independientes de los ficheros propios del theme, esta es una practica recomendable, ya que Wordpress no contempla el patrón MVC, pero eso no quita que separemos las cosas de una manera razonable para facilitar mantenimiento y escabilidad y en eso los plugins son parte vital.

Por otra parte cada uno de estos casos tenia un tratamiento diferente para WordPress, mientras que en el caso del API REST podemos usar directamente la función wp_remote_request() del API de WordPress ya que vamos a realizar una llamada GET. Para el caso de una conexión SOAP se implementa todo con la típica SoapClient de PHP.

Conectar a una API REST

Usando wp_remote_request() primero definimos los parametros de conexión. Se trata de un API REST que espera autentificar la conexión mediante un API KEY que nos habran asignado y (en este caso particular) una URL de referencia. Si alguno de estos parametros no es correcto no tendremos acceso.

Esto lo hacemos asi:

$args_api = array('headers' => array('X-API-KEY' => $_EL_API_KEY_ASIGNADO,
 'URL_BASE' => $_SERVER["HTTP_HOST"]) );

Luego a la URL que tenemos asignada para conectarnos a la API le añadimos los parámetros deseados de la conexión tipo GET que realizamos, esto es lo que hacemos aquí, evidentemente en este caso es solo un ejemplo:

$url_api.='/publicaciones_descargas/limit/1';

Con la URL de conexión a la API y los parametros para autentificarnos, lanzamos la conexión:

$losdatos = wp_remote_request($url_api,$args_api);

La función wp_remote_request() nos devuelve un array con el resultado de la conexión, en el item ‘body’ de ese array (en este caso) esta todo el resultado recibido desde la API. Solo nos queda tratarlo como necesitemos, en este ejemplo paso los datos recibidos en formato JSON a un array $info para su posterior uso en el WordPress:

$info = json_decode($losdatos['body'],true);

 Conectar a una API SOAP

Aquí la cosa es diferente y usamos la class SoapClient. Primero instanciamos el objeto y la conexión:

$Soap_Object = new SoapClient("URL DE ACCESO SOAP A LA API -aqui va el tuyo-",
 array('trace' => true)
 );

Luego con el objeto creado, en este ejemplo $Soap_Object, accedemos a las funciones propias que implemente esa API, como métodos del objeto que hemos instanciado, por ejemplo:

$objResponse = $Soap_Object->existeContacto(array('email' => 'un email de ejemplo'));

Donde el metodo existeContacto() estará definido para esa API SOAP en concreto, que estemos usando. Las llamadas a los métodos siempre (si se han hecho las cosas bien) devuelven una respuesta que podemos poner en una variable y mostrar o evaluar para saber si todo has salido ok. En este ejemplo esto ocurre en $objResponse, que luego puede, por ejemplo, usarse así:

if( $objResponse->return->codigo == 4 )

Donde la propiedad “código” también es en este caso una propiedad definida por la API SOAP usada, pero que en otra sera diferente.

Por otra parte la class SoapClient tiene otros métodos y propiedades que nos pueden ser de ayuda en fase de desarrollo o debug, por ejemplo si una vez establecida la conexión ejecutamos un:

$objResponse = $Soap_Object->__getFunctions();
print_r($objResponse);

Obtendremos un array con todas los métodos que tiene definida la API SOAP con la que estamos conectando, esto nos ayuda a ver que acciones podemos realizar. En la API SOAP del proyecto que comento, esta llamada producía un array así:

Array
 (
 [0] => borrarContactoResponse borrarContacto(borrarContacto $parameters)
 [1] => altaContactoResponse altaContacto(altaContacto $parameters)
 [2] => actualizarCorreoResponse actualizarCorreo(actualizarCorreo $parameters)
 [3] => existeContactoResponse existeContacto(existeContacto $parameters)
 [4] => borrarContactoResponse borrarContacto(borrarContacto $parameters)
 [5] => altaContactoResponse altaContacto(altaContacto $parameters)
 [6] => actualizarCorreoResponse actualizarCorreo(actualizarCorreo $parameters)
 [7] => existeContactoResponse existeContacto(existeContacto $parameters)
 )

Aunque esta claro que no debemos esperar a realizar esto para conocer que nos ofrece la API, ya que se supone que el cliente nos ha facilitado la documentación necesaria, pero es un ejemplo de las posibilidades que nos ofrece SoapClient.

Nuestro amigo el Proxy

Todo esto funciona sin más problemas, pero si la web donde se realiza esta funcionando detrás de un proxy, las conexiones deben contemplarlo y  deben añadir la configuración de paso de tal proxy.

En el caso de la conexión a la API SOAP debemos sustituir:

$Soap_Object = new SoapClient("URL DE ACCESO SOAP A LA API -aqui va el tuyo-",
 array('trace' => true)
 );

Por:

$Soap_Object = new SoapClient("URL DE ACCESO SOAP A LA API -aqui va el tuyo-",
 array('trace' => true, 'proxy_host' => '192.0.0.0', 'proxy_port' => '8080' )
 );

Donde 192.0.0.0 es evidentement una IP de ejemplo, en definitiva en ‘proxy_host’ añadimos la IP del proxy y en ‘proxy_port’ el puerto

Para el caso de la API REST y como la llamada es mediante wp_remote_request() bastara con tener en el wp-config.php de WordPress la configuración para paso por el proxy.

Estos solo son dos ejemplos consumiendo servicios web en un WordPress. Para ambos casos (REST y SOAP) aun hay más posibilidades como tambien la de ser servidor de estos servicios, pero ese ya es otro tema.

Para tener una visión general de ellos, bajo PHP, recomiendo la lectura del libro PHP Web Services