$30 off During Our Annual Pro Sale. View Details »

HTTP-Clients in PHP - vom fopen-Wrapper zur Sym...

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.

Denis Brumann

September 26, 2019
Tweet

More Decks by Denis Brumann

Other Decks in Programming

Transcript

  1. 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
  2. @dbrumann / [email protected] 22 Library A Library B Httplug Httplug

    Your App Httplug Guzzle 6-Adapter Guzzle 5-Adapter
  3. @dbrumann / [email protected] 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)
  4. @dbrumann / [email protected] 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.
  5. @dbrumann / [email protected] 25 $request = new Request('GET', 'https://reqres.in/api/users'); use

    GuzzleHttp\Psr7\Request; use Psr\Http\Client\ClientInterface; $response = $client->sendRequest($request);
  6. @dbrumann / [email protected] 26 use Psr\Http\Client\ClientInterface; $response = $client->sendRequest($request); $request

    = $requestFactory->createRequest('GET', 'https://reqres.in/api/users'); use Psr\Http\Message\RequestFactoryInterface;
  7. @dbrumann / [email protected] 32 A Client must not treat a

    well-formed HTTP request or HTTP response as an error condition.
  8. @dbrumann / [email protected] 40 $response = $httpClient->request( 'GET', 'https://httpbin.org/get', [

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

    array; public function getContent(bool $throw = true): string; public function toArray(bool $throw = true): array;
  11. @dbrumann / [email protected] 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>
  12. @dbrumann / [email protected] 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 .