Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unplug the HTTPlug

Unplug the HTTPlug

ll y a beaucoup de librairies qui permettent de faire des appels HTTP depuis nos applications. Parfois un projet utilise plus d'un "client" et il devient compliqué de savoir et contrôler comment ces appels sont déclenchés.

HTTPlug est un petit écosystème (librairies, adapteurs, bridges avec les frameworks, actif dans la création des PSRs…) qui peut aider à créer une abstraction autour du client HTTP. Il contient les adapteurs vers les librairies les plus connues (Guzzle, cURL, …) et adopte complètement les PSR7 et PSR18. En utilisant quelque chose comme HTTPlug, vous aurez la possibilité de normaliser le comportement et d'avoir un seul point d'entrée pour interagir avec les APIs.

Avec ce talk, l'objectif est de présenter l'écosystème, ses avantages, inconvénients et comment il peut aider votre projet à être plus solide.

Stéphane HULARD

June 24, 2020
Tweet

More Decks by Stéphane HULARD

Other Decks in Programming

Transcript

  1. P ? P ? Centraliser les appels HTTP de plus

    en plus présents. Faciliter les tests et le debug.
  2. L' 'HTTP L' 'HTTP Avril 2015 - Premier commit Octobre

    2018 - Version 2.0, compatible PSR18 Novembre 2018 - Sortie de la PSR18 2020 - Intégration de plus en plus répandue
  3. U U Clients: cURL, socket. Adapteurs: Guzzle(5/6), Symfony HTTPClient, ReactPHP…

    Plugins: Authentification, Log, Cache… composer require php-http/[client,plugin]
  4. U PSR U PSR use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestInterface; class MyApiDataRetriever

    { private $httpClient; public function __construct(ClientInterface $httpClient) { $this->httpClient = $httpClient; } public function retrieveData(RequestInterface $message): AwesomeDTO { return AwesomeDTO::fromResponse( $this->httpClient->sendRequest($message) ); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  5. I I use Http\Adapter\React\Client; use Laminas\Diactoros\RequestFactory; $client = new Client(/*

    options */); $dto = (new MyApiDataRetriever($client))->retrieveData( (new RequestFactory)->createRequest('GET', 'http://example.com/api') ); 1 2 3 4 5 6 7 8
  6. A A use Http\Discovery\HttpClientDiscovery; use Http\Discovery\MessageFactoryDiscovery; $client = HttpClientDiscovery::find(); $messageFactory

    = MessageFactoryDiscovery::find(); 1 2 3 4 5 6 $dto = (new MyApiDataRetriever($client))->retrieveData( 7 $messageFactory->createRequest('GET', 'http://example.com/api') 8 ); 9
  7. A A class AwesomeDecorator implements ClientInterface { private $decorated; public

    function __construct(ClientInterface $client) { $this->decorated = $client; } public function sendRequest(RequestInterface $request): ResponseInterface { /* Vérification ou traitement spécifique */ $response = $this->decorated->sendRequest($request); /* Vérification ou traitement spécifique */ return $response; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  8. php-http/mock-client $client = new Http\Mock\Client; 1 2 $client->on( 3 new

    RequestMatcher('/api', 'example.com'), 4 function (): ResponseInterface { 5 /* Créer une réponse adaptée */ 6 return $response; 7 } 8 ); 9 10 $dto = (new MyApiDataRetriever($client))->retrieveData( 11 $messageFactory->createRequest('GET', 'http://example.com/api') 12 ); 13
  9. V V