Cómo consumir servicios Rest con PHP (API)



En los artículos anteriores te mostré que es un RestFul web service y como crear uno usando PHP. Ahora voy a mostrarte como puedes consumir servicios o API Rest con PHP de forma sencilla.

Para hacer esto más sencillo voy a utilizar una librería llamada Guzzle la cual hace más fácil hacer peticiones HTTP para trabajar con servicios.

Voy a instalar esta librería usando Composer, si nunca has trabajado con Composer o quieres aprender un poco más, puedes leer este artículo sobre Composer.

Primero crea una carpeta, en mi caso será cliente-rest, luego abre una ventana de comandos (consola) y navega hasta la carpeta que acabas de crear, y escribe este comando:

composer init
Salida comando composer init
Composer

Con eso acabas de configurar un proyecto vacío para utilizar composer. El siguiente paso es instalar Guzzle, para ello escribes este otro comando:

composer require guzzlehttp/guzzle

NOTA: Vamos a consumir el servicio Restful que creamos en el artículo Como crear un Restful web service con php, puedes consultar el artículo y crear el mismo servicio para poder seguir este tutorial o adaptarlo a otro servicio que tengas disponible

Ya está listo, ahora solo tienes que crear un archivo, por ejemplo index.php, y escribes este código:

<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
//Crear el cliente para llamadas al servicio
//Debes cambiar el valor de base_uri a la dirección en donde esta tu servicio
//El valor de timeout, en este caso es para decir que despues de 5 segundos
//si el servicio no responde, se cancela el proceso.
$client = new Client([
    'base_uri' => 'http://localhost/blog/api/v1/post.php',
    'timeout'  => 5.0,
]);
//Hacer la llamada al metodo get, sin ningún parametro
$res = $client->request('GET');
if ($res->getStatusCode() == '200') //Verifico que me retorne 200 = OK
{
  echo $res->getBody();
}
?>

Lo que hace el código anterior es muy sencillo, primero agregamos el archivo autoload.php que hizo Composer para nosotros.

Luego declaramos que vamos a usar las variables que están en la ruta GuzzleHttp\Client. Después creamos un cliente HTTP y le pasamos la dirección del servicio REST que vamos a consumir, también le pasamos un parámetro que indica que la llamada va a esperar un máximo de 5 segundos por la respuesta antes de dar un error.

Finalmente hacemos la llamada por medio del método GET, este nos va a regresar todos los posts mediante el servicio Rest, pero también verificamos si el código de retorno es 200, de ser así imprimimos el resultado.

Si todo te ha salido bien, verás algo como esto:

Cliente rest en php
Datos que regresa el servicio RESTful

Si el servicio te regresa información, pero no se ve tan ordenada como en la imagen, puedes instalar una extensión en Chrome como la que yo utilizo JSONView.

Ahora veamos como llamar al servicio Rest enviando parámetros, vamos a recuperar toda la información de un post específico.

<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
//Crear el cliente para llamadas al servicio
//Debes cambiar el valor de base_uri a la dirección en donde esta tu servicio
//El valor de timeout, en este caso es para decir que despues de 5 segundos
//si el servicio no responde, se cancela el proceso.
$client = new Client([
    'base_uri' => 'http://localhost/blog/api/v1/post.php',
    'timeout'  => 5.0,
]);
//Hago llamado a REST para recuperar un solo articulo
//Ahora le pasamos un parametro al llamado del servicio
$res = $client->request('GET',null,[
    'query' => ['id' => '1']  
]);
if ($res->getStatusCode() == '200') //Verifico que me retorne 200 = OK
{
  //Convertir el resultado que viene en formato JSON a un array
  $json2Array = json_decode($res->getBody(), true);
  //Ahora que esta la informacion en Array, podemos acceder a ella de forma sencilla
  echo $json2Array['content'];
}
?>

Ahora el código ha cambiado un poco, cuando llamo el método request, para llamar al servicio, le envío 3 parámetros en lugar de uno.

El primero es el método HTTP, que es GET, el segundo es alguna modificación a la ruta del servicio, en caso de que la ruta cambie según la sección del servicio Rest que se desea consumir, pero en este caso le envío null por que la ruta es la misma.

Finalmente, el tercer parámetro es el que sirve para enviarle los parámetros al servicio, estos se envían en forma de array y usando la llave query para parámetros de tipo GET y se usa form_params para enviar parámetros de tipo POST (como veremos más adelante).

Luego todo sigue igual, excepto que ahora uso la función de PHP json_decode para transformar el contenido en formato json a un array asociativo. Luego puedo acceder al contenido como un array típico de PHP.

Ahora veamos el resto de los casos: POST, DELETE y PUT

<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
    'base_uri' => 'http://localhost/blog/api/v1/post.php',
    'timeout'  => 5.0,
]);
// =============================================
//Hago la llamada al servicio rest, para insertar un articulo
$articulo = ['title'=>'Insertar usando Rest',
             'status'=>'draft',
             'content'=>'Este es un ejemplo del metodo POST',
             'user_id'=>'1'
            ];
$res = $client->request('POST', '', ['form_params' => $articulo]);
if ($res->getStatusCode() == '200') //Verifico que me retorne 200 = OK
{
  echo "Se inserto un post (articulo)";
}
// =============================================
//Actualizar un articulo usando PUT
$actualizar = ['title'=>'Articulo actualizado',
             'status'=>'draft',
             'content'=>'Esta es una guia sencilla',
             'user_id'=>'1',
             'id'=>'1' //ID del articulo a modificar
            ];
$res = $client->request('PUT',null,[
    'query' => $actualizar
]);
if ($res->getStatusCode() == '200') //Verifico que me retorne 200 = OK
{
  echo $res->getBody();
}
// =============================================
//Hago llamado a REST para borrar un  articulo
$res = $client->request('DELETE',null,[
    'query' => ['id' => '1'] //Id del post a eliminar
]);
if ($res->getStatusCode() == '200') //Verifico que me retorne 200 = OK
{
  echo $res->getBody();
}
?>

No explico esta otra parte, porque ya todo debe ser familiar para ti, si tienes alguna duda sobre este código, te dio algún error, o simplemente te funciono bien, no olvides que puedes dejarme un comentario abajo en este artículo.

Siempre trato de mantener el código lo más simple posible y debes saber que aquí hace falta hacer algunas validaciones y otras mejoras, pero espero que el concepto de como poder consumir los servicios Rest, este muy claro ahora.

Nota: Si has disfrutado este u otro de mis artículos sobre RESTful, seguramente vas a disfrutar mi libro sobre RESTful disponible en amazon.com a un precio increíble y lleno de muchos temas.

Deja una respuesta

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