HTTP-Clients in PHP - vom fopen-Wrapper zur Symfony-Komponente

6a1345d8e6dd15b2c78eff0c331963b1?s=47 Denis Brumann
September 26, 2019

HTTP-Clients in PHP - vom fopen-Wrapper zur Symfony-Komponente

HTTP-Requests aus einer PHP-Anwendung zu verschicken, war früher kompliziert.
Von aufwendigem Stream-Handling über eine Vielzahl an Bibliotheken hin zu einem gemeinsamen Standard hat sich viel getan. In meinem Talk gebe ich einen kurzen Einblick in die Historie von HTTP-Clients, einen Überblick über den PSR-18 Standard hin zu Symfonys HttpClient-Komponente und welche Vorteile sie bietet.

6a1345d8e6dd15b2c78eff0c331963b1?s=128

Denis Brumann

September 26, 2019
Tweet

Transcript

  1. Vom fopen-Wrapper zum Symfony HttpClient

  2. Denis Brumann @dbrumann Software Developer Berlin, Germany

  3. 3 HTTP-Requests in PHP eine kurze Geschichtsstunde By Copyright ©

    2005 David Monniaux - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=494543
  4. @dbrumann / denis.brumann@sensiolabs.de 4

  5. @dbrumann / denis.brumann@sensiolabs.de 5

  6. @dbrumann / denis.brumann@sensiolabs.de 6

  7. @dbrumann / denis.brumann@sensiolabs.de 7

  8. @dbrumann / denis.brumann@sensiolabs.de 8

  9. @dbrumann / denis.brumann@sensiolabs.de 9

  10. HTTP-Clients!

  11. @dbrumann / denis.brumann@sensiolabs.de 11 composer require guzzle/guzzle

  12. @dbrumann / denis.brumann@sensiolabs.de 12

  13. @dbrumann / denis.brumann@sensiolabs.de 13

  14. @dbrumann / denis.brumann@sensiolabs.de 14 composer require guzzlehttp/guzzle

  15. @dbrumann / denis.brumann@sensiolabs.de 15

  16. @dbrumann / denis.brumann@sensiolabs.de 16

  17. @dbrumann / denis.brumann@sensiolabs.de 17

  18. @dbrumann / denis.brumann@sensiolabs.de 18 Library A Library B Guzzle 5

    Guzzle 6 Your App
  19. @dbrumann / denis.brumann@sensiolabs.de 19

  20. None
  21. @dbrumann / denis.brumann@sensiolabs.de 21

  22. @dbrumann / denis.brumann@sensiolabs.de 22 Library A Library B Httplug Httplug

    Your App Httplug Guzzle 6-Adapter Guzzle 5-Adapter
  23. @dbrumann / denis.brumann@sensiolabs.de 23 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)
  24. @dbrumann / denis.brumann@sensiolabs.de 24 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.
  25. @dbrumann / denis.brumann@sensiolabs.de 25 $request = new Request('GET', 'https://reqres.in/api/users'); use

    GuzzleHttp\Psr7\Request; use Psr\Http\Client\ClientInterface; $response = $client->sendRequest($request);
  26. @dbrumann / denis.brumann@sensiolabs.de 26 use Psr\Http\Client\ClientInterface; $response = $client->sendRequest($request); $request

    = $requestFactory->createRequest('GET', 'https://reqres.in/api/users'); use Psr\Http\Message\RequestFactoryInterface;
  27. @dbrumann / denis.brumann@sensiolabs.de 27

  28. @dbrumann / denis.brumann@sensiolabs.de 28 HttpClientInterface::sendRequest() RequestInterface

  29. @dbrumann / denis.brumann@sensiolabs.de 29 RequestExceptionInterface

  30. @dbrumann / denis.brumann@sensiolabs.de 30 HttpClientInterface::sendRequest() RequestInterface ResponseInterface

  31. @dbrumann / denis.brumann@sensiolabs.de 31 NetworkExceptionInterface

  32. @dbrumann / denis.brumann@sensiolabs.de 32 A Client must not treat a

    well-formed HTTP request or HTTP response as an error condition.
  33. @dbrumann / denis.brumann@sensiolabs.de 33 Wie konfiguriere ich meinen HttpClient?

  34. @dbrumann / denis.brumann@sensiolabs.de 34 Wie kann ich Requests asynchron versenden?

  35. @dbrumann / denis.brumann@sensiolabs.de 35 Was ist mit HTTP/2- oder HTTP/3-Features?

  36. @dbrumann / denis.brumann@sensiolabs.de 36

  37. @dbrumann / denis.brumann@sensiolabs.de 37 composer require symfony/http-client

  38. @dbrumann / denis.brumann@sensiolabs.de 38

  39. @dbrumann / denis.brumann@sensiolabs.de 39 $response = $this->httpClient->request( 'GET', 'https://reqres.in/api/users' );

  40. @dbrumann / denis.brumann@sensiolabs.de 40 $response = $httpClient->request( 'GET', 'https://httpbin.org/get', [

    // these values are automatically encoded // before including them in the URL 'query' => [ 'token' => '...', 'name' => '...', ], ] );
  41. @dbrumann / denis.brumann@sensiolabs.de 41 @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
  42. @dbrumann / denis.brumann@sensiolabs.de 43 public function getHeaders(bool $throw = true):

    array; public function getContent(bool $throw = true): string; public function toArray(bool $throw = true): array;
  43. @dbrumann / denis.brumann@sensiolabs.de 44

  44. @dbrumann / denis.brumann@sensiolabs.de 45

  45. @dbrumann / denis.brumann@sensiolabs.de 46

  46. @dbrumann / denis.brumann@sensiolabs.de 47 Library A Library B Guzzle 6

    Guzzle 5 Your App
  47. @dbrumann / denis.brumann@sensiolabs.de 48 Library A Library B Symfony 5

    Symfony 4 Your App ?
  48. @dbrumann / denis.brumann@sensiolabs.de 49

  49. @dbrumann / denis.brumann@sensiolabs.de 50

  50. @dbrumann / denis.brumann@sensiolabs.de 51 Symfony\Component\HttpClient\ Psr18Client

  51. @dbrumann / denis.brumann@sensiolabs.de 52 <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>
  52. @dbrumann / denis.brumann@sensiolabs.de 53 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 .
  53. @dbrumann / denis.brumann@sensiolabs.de 54 HttpClient::create() Curl Native

  54. @dbrumann / denis.brumann@sensiolabs.de 55

  55. @dbrumann / denis.brumann@sensiolabs.de 56

  56. @dbrumann 58 Thank You! https://joind.in/talk/e8765