Guzzle: framework para construir clientes de servicios REST

Posted by victor on February 5th, 2013
guzzle-logoGuzzle es un  framework que no permite crear, con pocas líneas de código, un cliente capaz de consumir servicios REST como los de Twitter, GitHub o Facebook. Guzzle emplea la librería cURL para realizar las peticiones HTTP a los servicios y provee un sencillo sistema de descripción de servicios que documentan y detallan los métodos que podrá usar el cliente. Guzzle permite usar cualquier verbo del protocolo HTTP: GET, POST, DELETE... y dispone de mecanismos de caché de respuestas y de realización de consultas en paralelo y batch. La facilidad de uso de Guzzle se ve en ejemplos como este en el que se escribe un pequeño cliente para Twitter:
// Endpoint de la API de Twitter
$client = new Client('https://api.twitter.com/{version}', array(
    'version' => '1.1'
));

// Usamos el protocolo oAuth para firmar las peticiones mediante OauthPlugin con
// los datos que nos proporciona Twitter
$client->addSubscriber(new Guzzle\Plugin\Oauth\OauthPlugin(array(
    'consumer_key'    => 'tu consumer_key',
    'consumer_secret' => 'tu consumer_secret',
    'token'           => 'tu token',
    'token_secret'    => 'tu token_secret'
)));

// Devolvemos los últimos twits del usuario (Doc API Twitter)
echo $client->get('statuses/user_timeline.json')->send()->getBody();
La descripción de los servicios es un punto muy importante de esta librería ya que de una sola vez, documentamos y establecemos los tipos de datos que conforma el resultado de cada método. Los servicios se pueden describir mediante arrays PHP o usando JSON. Recomiendo esta última ya que me parece más legible.
{
    "name": "API ejemplo",
    "apiVersion": "2013-02-05",
    "baseUrl": "http://api.ejemplo.es",
    "description": "Descripción de la API",
    "operations": {
        "GetUsers": {
            "httpMethod": "GET",
            "uri": "/users",
            "summary": "Obtiene la lista de usuarios",
            "responseClass": "GetUsersOutput"
        },

    },
    "models": {
        "GetUsersOutput": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "location": "json",
                        "type": "string"
                    },
                    "age": {
                        "location": "json",
                        "type": "integer"
                    }
                }
            }
        }
    }
}
Cómo ves el JSON es bastante descriptivo y a cada método le indicamos el modelo de datos que esperamos como respuesta mediante el atributo models. Tras esto solo queda asociarla a nuestro cliente y estaremos en disposición de consumir sus métodos:
use Guzzle\Service\Description\ServiceDescription;

$description = ServiceDescription::factory('/path/to/descripcion-servicio.json');
$client->setDescription($description);
  Código fuente: Github.

Comments

comments powered by Disqus