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. U HTTP
    U HTTP

    View Slide

  2. S H
    S H
    Consultant, Formateur, Contributeur.
    @s_hulard
       

    View Slide

  3. HTTP ?
    HTTP ?
    Un éléphant qui parle HTTP !

    View Slide

  4. P ?
    P ?
    Centraliser les appels HTTP de plus en plus présents.
    Faciliter les tests et le debug.

    View Slide

  5. 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

    View Slide

  6. U
    U
    Clients: cURL, socket.
    Adapteurs: Guzzle(5/6), Symfony HTTPClient, ReactPHP…
    Plugins: Authentification, Log, Cache…
    composer require php-http/[client,plugin]

    View Slide

  7. E ?
    E ?
    Pourquoi faire simple…

    View Slide

  8. P
    P
    Interopérabilité ?

    View Slide

  9. 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

    View Slide

  10. 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

    View Slide

  11. 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

    View Slide

  12. U
    U
    Séparation des responsabilités (client, messages…),
    Définition des prérequis pour chacun de vos objets.

    View Slide

  13. 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

    View Slide

  14. T HTTP

    T HTTP

    …dès qu'il y a des tiers.

    View Slide

  15. L
    L
    Psr\Http\Client\ClientInterface
    Psr\Http\Message\*

    View Slide

  16. 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

    View Slide

  17. V
    V

    View Slide

  18. View Slide