27 août 2010

REST_Client et REST_Puller à la sauce Swift

Dans mes précédents billets, j'ai présenté REST_Client et REST_Puller. Ces 2 classes PHP ont été écrites rapidement à plusieurs mois d'intervalle dans des contextes différents puis rassemblées dans un unique package PEAR. La conséquence est un manque flagrant de cohérence. Et bien c'est maintenant terminé !

Refactoring

Par la volonté et l'aide de kerphi le package REST_Client a subit une grosse refactorisation. Nous avons soigné la POO en appliquant quelques grands motifs de conception et une interface objet à la mode. Un style de programmation que l'on trouve par exemple dans la librairie Swift. Maintenant le package s'utilise très simplement avec 2 classes REST_Client et REST_EasyClient.

REST_EasyClient

Comme son nom l'indique, cette classe est simple et rapide à utiliser. Elle est idéale si l'on souhaite récupérer le résultat d'une ou plusieurs requêtes HTTP envoyées à un même serveur.

Exemples

echo REST_EasyClient::newInstance('fr.php.net')->get('/curl')->content;

// La même chose avec un Proxy
echo REST_EasyClient::newInstance('fr.php.net')
       ->setHttpProxy('proxy.exemple.com:8080')
       ->get('/curl')
       ->content;

// la même chose façon vieille école  ;-)

$client = new REST_EasyClient('fr.php.net');
$client->setHttpProxy('proxy.exemple.com:8080');
$response = $client->get('/curl');
echo $response->content;

REST_Client

Contrairement à la classe précédente, REST_Client permet de maîtriser finement la construction de la requête HTTP et la façon de l'envoyer. REST_Client permet donc d'envoyer plusieurs requêtes plus ou moins différentes de manière synchrones ou asynchrones, le tout avec une interface d'utilisation identique.

Requêtes synchrones

Permet le lancement de plusieurs requêtes séquentiellement.

$r = REST_Request::newInstance()
     ->setProtocol('http')
     ->setHost('fr.php.net')
     ->setPort(80)
     ->setMethod('GET')
     ->setUrl('/curl');

$c = REST_Client::factory('sync', array('verbose' => false));
$id = $c->fire($r);
$response = $c->fetch();

echo $response->id . PHP_EOL;
echo $response->code . PHP_EOL;
echo $response->content . PHP_EOL;

$r->setUrl('/dom');

$id = $c->fire($r);
$response = $c->fetch();

echo $response->id . PHP_EOL;
echo $response->code . PHP_EOL;
echo $response->content . PHP_EOL;

Requêtes asynchrones

Permet le lancement de plusieurs requêtes en parallèle et de manière asynchrone (Les résultats arrivent dans un ordre différent de l'ordre de lancement). Cette classe remplace feu REST_Puller.

$r = REST_Request::newInstance()
     ->setProtocol('http')
     ->setHost('fr.php.net')
     ->setHttpProxy('proxy.example.com');


$c = REST_Client::factory('sync', array(
    'verbose' => false,
    'queue_size' => 2,
));

$urls = array('/dom','/curl','/strings', '/pcre', '/xml', '/ftp', '/sockets');

foreach($urls as $i => $url) {
  $id = $c->fire($r->get($url));
  if ($i > $c->getOption('queue_size')) {
     $response = $p->fetch();
     var_dump($response);
  }
}

while($response = $p->fetch()) {
    var_dump($response);
}

Téléchargement et code source

Le code source est disponible sur GitHub : http://github.com/touv/rest_client

Ou, on peut directement l'installer avec PEAR en s'abonnant au Channel Respear :

% pear channel-discover pear.respear.net
% pear install respear/REST_Client

Aucun commentaire:

Enregistrer un commentaire