Llamar a una API REST desde Laravel con Guzzle

A veces nos encontramos con la necesidad de llamar a una API REST desde nuestro servidor. Podemos hacer varias variantes, e incluso hace una llamada cURL para resolverlo, pero es interesante plantearlo de esta otra manera, mediante Guzzle.

Utilizaremos Guzzle (http://guzzlephp.org/), que es un cliente de REST que podemos instalar en nuestro proyecto de Laravel.

El primer paso es instalarlo, para esto añadimos este require a nuestro composer.json

{
    "require": {
        "guzzlehttp/guzzle": "~6.0"
    }
}

luego en la consola hemos de ejecutar actualizar Composer:

$ composer update

Ya tenemos listo todo para comenzar a utilizarlo!. Ahora bien, imaginemos un Controller en Laravel que devuelve la ficha de un producto. Esta dicha ha de devolver el precio en Euros y Dólares. Para obtener la cotización del Euro con respecto al Dolar hay de llamar a una API REST.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ProductoController extends Controller
{
    //función publica de entrada (el route debe apunta aquí).
    public function ficha(Request $request)
    {
        //obtengo el producto
        $producto_id = $request->input('id');
        $producto = Producto::where('id','=',$producto_id)->first();
        //devuelvo la info del producto, pero el precio en dólares lo calculo)
        return [
            'nombre' => $producto->nombre,
            'descripcion' => $producto->descripcion,
            'url_imagen' => $producto->url_imagen,
            'precio_euro' => $producto->precio,
            'precio_dolares' => $this->cotizarEnDolares($producto->precio)
        ];
    }
    //función para convertir de euros a dólares
    protected function cotizarEnDolares($precio){
        //creo un nuevo cliente Guzzle
        $cliente = new \GuzzleHttp\Client();

        //llamo al servicio ubicado en esa URL utilizando método GET (esto debe estar especificado en el servicio)
        //envío por parámetro la variable "cantidad" que contiene cuanto se ha de convertir
        $respuesta = $cliente->request('GET', 'http://servicio.com/convertir-eur-usd', [
            'auth' => [ $lrs->user, $lrs->password ],
            'json' => [
                'cantidad' => $precio
            ]
        ]);
        //el servicio web retorna en un string en el body de la respuesta el valor
        return $respuesta->getBody();
    }
}

En este pequeño ejemplo se puede ver como utilizar Guzzle, pero existen muchas variantes de su uso y una no muy extensa pero excelente documentación. Visitarla aquí: http://docs.guzzlephp.org/en/latest/index.html (English only, sorry!)

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on StumbleUpon
Pablo Oneto

Soy un desarrollador de software web especializado en PHP.

Deja un comentario