Symfony HttpClient

Symfony HttpClient

The Symfony HttpClient is quite new, but is built based on years of experience from other http clients. The talk explores how to do HTTP requests inside a PHP application from native functions to popular libraries and the PSR-18 standard leading to the component.

The slides have placeholders showing blackfire.io profiles in place of code samples from a demo project.

6a1345d8e6dd15b2c78eff0c331963b1?s=128

Denis Brumann

August 06, 2019
Tweet

Transcript

  1. 1.

    Symfony HttpClient Denis Brumann @dbrumann denis.brumann@sensiolabs.de Photo: Martina Nolte, Lizenz:

    Creative Commons by-sa-3.0 de https://commons.wikimedia.org/wiki/File:2013-06-08_Projekt_Hei%C3%9Fluftballon_DSCF0801.jpg
  2. 2.
  3. 22.
  4. 25.

    @dbrumann 26 Library A Library B Httplug Httplug Your App

    Httplug Guzzle 6-Adapter Guzzle 5-Adapter
  5. 26.

    @dbrumann 27 Encourage devs to depend on the HTTPlug interface

    instead of concrete clients. Provide good quality HTTP- related packages to the PHP community. Over time, make HTTPlug a PHP Standards Recommendation (PSR) Goals
  6. 30.

    @dbrumann 32 The goal of this PSR is to allow

    developers to create libraries decoupled from HTTP client implementations. This will make libraries more reusable as it reduces the number of dependencies and lowers the likelihood of version conflicts.
  7. 34.

    @dbrumann 37 A Client must not treat a well-formed HTTP

    request or HTTP response as an error condition.
  8. 36.

    @dbrumann 36 $psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory(); $psr18Client = new \Buzz\Client\Curl($psr17Factory);

    $request = $psr17Factory->createRequest('GET', 'http://tnyholm.se'); $response = $psr18Client->sendRequest($request);
  9. 37.

    @dbrumann 39 $psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory(); $psr18Client = new \Buzz\Client\Curl($psr17Factory);

    $request = $psr17Factory->createRequest('GET', 'http://tnyholm.se'); $response = $psr18Client->sendRequest($request);
  10. 52.

    @dbrumann 54 <service id="psr18.http_client" class="Symfony\Component\HttpClient\Psr18Client" > <argument type="service" id="http_client" />

    <argument type="service" id="Psr\Http\Message\ResponseFactoryInterface" on-invalid="ignore" /> <argument type="service" id="Psr\Http\Message\StreamFactoryInterface" on-invalid="ignore" /> </service>
  11. 53.

    @dbrumann 55 $response = $httpClient->request( 'GET', 'https://httpbin.org/get', [ // these

    values are automatically encoded // before including them in the URL 'query' => [ 'token' => '...', 'name' => '...', ], ] );
  12. 55.
  13. 56.

    @dbrumann 58 @throws TransportExceptionInterface When a network error occurs @throws

    RedirectionExceptionInterface On a 3xx when $throw is true and the "max_redirects" option has been reached @throws ClientExceptionInterface On a 4xx when $throw is true @throws ServerExceptionInterface On a 5xx when $throw is true
  14. 57.

    @dbrumann 60 public function getHeaders(bool $throw = true): array; public

    function getContent(bool $throw = true): string; public function toArray(bool $throw = true): array;
  15. 59.

    @dbrumann 60 T h e c o m p o

    n e n t i s b u i l t f o r m a x i m u m H T T P p e r f o r m a n c e . B y d e s i g n , i t i s c o m p a t i b l e w i t h H T T P / 2 a n d w i t h d o i n g c o n c u r r e n t a s y n c h r o n o u s s t r e a m e d a n d m u l t i p l e x e d r e q u e s t s / r e s p o n s e s . E v e n w h e n d o i n g re g u l a r s y n c h ro n o u s c a l l s , t h i s d e s i g n a l l o w s k e e p i n g c o n n e c t i o n s t o re m o t e h o s t s o p e n b e t w e e n re q u e s t s , i m p ro v i n g p e r f o r m a n c e b y s a v i n g re p e t i t i v e D N S re s o l u t i o n , S S L n e g o t i a t i o n , e t c . To l e v e r a g e a l l t h e s e d e s i g n b e n e f i t s , t h e c U R L e x t e n s i o n i s n e e d e d .