Cómo consumir un WebService REST con PHP

Home / Cómo hacer para... / Cómo consumir un WebService REST con PHP

Un poco de background como para asegurarnos de que hablamos de lo mismo

Qué es un webservice

Un webservice (o servicio web) es una forma de integrar aplicaciones web. Básicamente se trata de un servidor que expone parte de su funcionalidad para que sus clientes (que generalmente son otros servidores de diferentes aplicaciones) puedan utilizarlas.

Las principales ventajas de usar web services son:

  1. La posibilidad de valernos de la capacidad instalada (¡y mantenida!) por terceros
  2. La facilidad para extender la funcionalidad de nuestra aplicación (Basta con realizar las llamadas al servicio web que deseamos)

La principal desventaja de usar este enfoque es que dependemos de servicios de terceros que, salvo en casos muy puntuales, no podemos controlar.

Ejemplos de webservices:

  1. Autenticación de usuarios vía Facebook, Google, Twitter, etc…
  2. Generación de mapas en tiempo real
  3. Consulta de cotizaciones de acciones

Qué es restful

Restful es un modelo arquitectónico de software que plantea una suerte de volver a las fuentes. Su filosofía se basa en el poder del protocolo HTTP (Subyacente en toda aplicación web), el cual incluye los conceptos de verbo (GET, POST, DELETE, PUT) y recurso, código de errores (404, 500, etc…) y demás elementos que, en teoría al menos, deberían alcanzar para modelar cualquier tipo de interacción cliente-servidor.

Es muy común que en una aplicación RESTful los objetos o entidades del modelo de datos sean expuestos casi directamente, teniendo una URL específica para cada uno de ellos.

Por ejemplo, en una aplicación diseñada para una institución educativa sería esperable encontrarse con una URL de tipo:

http://miescuela.com/alumnos

Al realizar una petición de tipo GET a esta URL se esperará recibir información de los alumnos de esa institución.

A su vez, una URL del tipo:

http://miescuela.com/alumnos/14

Debería darme información del alumno cuyo id es 14.

Existe mucha controversia respecto de qué es una API RESTful y qué no lo es… Sin entrar en mayor detalle, la idea es que, para consumir un servicio web basado en REST sólo se requiere conocer su URL (De nuevo, esto es en teoría… en la práctica se utilizan varias formas de modifiación del pedido, como ser el envío de headers y demás).

Cómo se comunican cliente y servidor

Siendo que se trata de un servicio RESTful, la comunicación entre cliente y servidor es sencilla (A diferencia de lo que es un WebService SOAP), se trata simplemente de enviar un pedido HTTP y procesar su respuesta.

Existen varias opciones disponibles, veamos las más comúnmente utilizadas:

cURL

La librería cURL permite realizar peticiones a servidores remotos. Si bien funciona, es un método de bastante bajo nivel, con sus pros y sus contras.

Volviendo al ejemplo que te comentaba antes, una forma de hacer la llamada sería esta:

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://miescuela.com/alumnos");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);

curl_close($ch);

En la variable $res quedará la respuesta del webservice (Asumiendo por supuesto que no haya habido ningún problema de conexión, transferencia, etc…).

file_get_contents

Una opción alternativa (y generalmente más conveniente) es el uso de la función file_get_contents. Esta función recibe como parámetro el nombre del archivo que se quiere leer y devuelve todo su contenido como un string.

Si bien el uso normal de la función es la lectura de archivos locales, php en realidad entiende a los archivos como flujos. Por lo tanto, si está todo bien configurado, una URL puede usarse como nombre de un flujo.

De este modo nos ahorramos muchas de las complicaciones propias de tratar con una interface de más bajo nivel (y, obviamente, perdemos cierto control, pero generalmente no es necesario hilar tan fino).

El ejemplo sería:

<?php
$res = file_get_contents("http://miescuela.com/alumnos");

Cómo se procesan los resultados

Los resultados se procesan de acuerdo al formato de la respuesta. Usualmente los Servicios Web devuelven XML o JSON (Existen otras posibilidades, claro, pero estas son las más comunes).

En el caso de tratarse de un XML, lo mejor es usar la biblioteca SimpleXML, si se trata de json, con json_decode será suficiente (Si se trata de otro formato habrá que estudiar el caso puntual, pero en última instancia, siempre se trata de procesar un string…).

Un ejemplo real

MercadoLibre tiene una API RESTful que permite interactuar con el sitio de forma simple.

Veamos un ejemplo de una llamada de acceso público: la que nos da información básica de un usuario.

La URL que se utiliza es https://api.mercadolibre.com/users/USERID/, por ejemplo https://api.mercadolibre.com/users/226384143/

El valor retornado es un string JSON.

El código completo para obtener esta información con php es:

<?php

echo file_get_contents('https://api.mercadolibre.com/users/226384143/');

Claro que si quisiéramos hacer algo con esta información sería más conveniente hacer algo como:

<?php

$data = json_decode( file_get_contents('https://api.mercadolibre.com/users/226384143/'), true );

echo $data['nickname'];

¡Listo! Ya estás en condiciones de integrar cualquier WebService RESTful en tu aplicación.

¿Tenés algún ejemplo de servicio del que te hayas querido aprovechar? ¿Tuviste alguna dificultad? ¡Comentalo y te ayudamos!

 

mchojrin

CEO at Leeway
Mauro es Lic. en Ciencias de la Computación.
Su carrera como docente de programación se inició en el año 1997 en la Escuela Técnica ORT.
Actualmente coordina el desarrollo de proyectos web en Leeway y los cursos dictados en la Leeway Academy

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *