Slide 1

Slide 1 text

Symfony HttpClient Denis Brumann @dbrumann [email protected] 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

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Denis Brumann @dbrumann Software Developer Berlin, Germany

Slide 4

Slide 4 text

@dbrumann 4 Making a Request in PHP

Slide 5

Slide 5 text

@dbrumann 5

Slide 6

Slide 6 text

@dbrumann 6

Slide 7

Slide 7 text

@dbrumann 7

Slide 8

Slide 8 text

@dbrumann 8

Slide 9

Slide 9 text

@dbrumann 9

Slide 10

Slide 10 text

@dbrumann 10

Slide 11

Slide 11 text

@dbrumann 11 Along Came Guzzle

Slide 12

Slide 12 text

@dbrumann 12 composer require guzzle/guzzle

Slide 13

Slide 13 text

@dbrumann 13

Slide 14

Slide 14 text

@dbrumann 14

Slide 15

Slide 15 text

@dbrumann 15

Slide 16

Slide 16 text

@dbrumann 16

Slide 17

Slide 17 text

@dbrumann 18 More Guzzle, More Cry

Slide 18

Slide 18 text

@dbrumann 19 composer require guzzlehttp/guzzle

Slide 19

Slide 19 text

@dbrumann 20

Slide 20

Slide 20 text

@dbrumann 21

Slide 21

Slide 21 text

@dbrumann 22 Library A Library B Guzzle 5 Guzzle 6 Your App

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

@dbrumann 24

Slide 24

Slide 24 text

@dbrumann 25

Slide 25

Slide 25 text

@dbrumann 26 Library A Library B Httplug Httplug Your App Httplug Guzzle 6-Adapter Guzzle 5-Adapter

Slide 26

Slide 26 text

@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

Slide 27

Slide 27 text

@dbrumann 29

Slide 28

Slide 28 text

@dbrumann 30

Slide 29

Slide 29 text

@dbrumann 31

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

@dbrumann 33 HttpClientInterface::sendRequest() RequestInterface ResponseInterface

Slide 32

Slide 32 text

@dbrumann 34 RequestExceptionInterface

Slide 33

Slide 33 text

@dbrumann 36 NetworkExceptionInterface

Slide 34

Slide 34 text

@dbrumann 37 A Client must not treat a well-formed HTTP request or HTTP response as an error condition.

Slide 35

Slide 35 text

@dbrumann 38 How to create a RequestInterface?

Slide 36

Slide 36 text

@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);

Slide 37

Slide 37 text

@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);

Slide 38

Slide 38 text

@dbrumann 37 How to configure the client?

Slide 39

Slide 39 text

@dbrumann 38 How to perform batch requests?

Slide 40

Slide 40 text

@dbrumann 39 How to perform asynchronous requests?

Slide 41

Slide 41 text

@dbrumann 43

Slide 42

Slide 42 text

@dbrumann 44 Library A Library B Guzzle 5 Guzzle 6 Your App

Slide 43

Slide 43 text

@dbrumann 45

Slide 44

Slide 44 text

@dbrumann 46

Slide 45

Slide 45 text

@dbrumann 47

Slide 46

Slide 46 text

@dbrumann 48 $response = $this->httpClient->request( 'GET', 'https://reqres.in/api/users' ); $data = $response->toArray();

Slide 47

Slide 47 text

@dbrumann 49 composer require symfony/http-client

Slide 48

Slide 48 text

@dbrumann 50

Slide 49

Slide 49 text

@dbrumann 51 HttpClient::create() Curl Native

Slide 50

Slide 50 text

@dbrumann 52 Symfony\Component\HttpClient\Psr18Client

Slide 51

Slide 51 text

@dbrumann 53

Slide 52

Slide 52 text

@dbrumann 54

Slide 53

Slide 53 text

@dbrumann 55 $response = $httpClient->request( 'GET', 'https://httpbin.org/get', [ // these values are automatically encoded // before including them in the URL 'query' => [ 'token' => '...', 'name' => '...', ], ] );

Slide 54

Slide 54 text

@dbrumann 56

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

@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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

@dbrumann 61

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

@dbrumann 61 Thank You!