Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Modern HTTP handling with PHP - Coolblue Behind...

Modern HTTP handling with PHP - Coolblue Behind The Scenes

PSR-7 describes common interfaces for representing HTTP messages. HTTP messages are the foundation of web development. Web browsers and HTTP clients such as cURL create HTTP request messages that are sent to a web server, which provides an HTTP response message. Server-side code receives an HTTP request message, and returns an HTTP response message.

Hannes Van De Vreken

April 04, 2017
Tweet

More Decks by Hannes Van De Vreken

Other Decks in Technology

Transcript

  1. !

  2. Common interfaces for HTTP messages - Works in any Framework

    - Both for HTTP Clients and HTTP applications - HTTP version independent PSR/HTTP-MESSAGE
  3. PSR/HTTP-MESSAGE interface RequestInterface { function getProtocolVersion(); function getHeaders(); function getHeader($name);

    function getHeaderLine($name); function getBody(); … } interface ResponseInterface { function getProtocolVersion(); function getHeaders(); function getHeader($name); function getHeaderLine($name); function getBody(); … }
  4. PSR/HTTP-MESSAGE interface RequestInterface implements MessageInterface { function getRequestTarget(); function getUri();

    function getMethod(); } interface ResponseInterface implements MessageInterface { function getStatusCode(); function getReasonPhrase(); }
  5. START USING PSR-7 IN YOUR APP Symfony request/response object ⁷

    ⁷ ⁷ Zend-Diactoros request/response object
  6. START USING PSR-7 IN YOUR APP Symfony request/response object ⁷

    ⁷ ⁷ Zend-Diactoros request/response object \Psr\Http\Message\RequestInterface type hinted
  7. MIDDLEWARE DEFINITION function ($request, $response, $next) { // Alter request,

    if you want $response = $next($request, $response); // Alter response, if you want return $response; }
  8. class CacheMiddleware implements MiddlewareInterface { public function process( ServerRequestInterface $request,

    DelegateInterface $delegate ) { // Alter request, if you want $response = $delegate->process($request); // Alter response, if you want return $response; } } HTTP MIDDLEWARE - PSR-15
  9. GUZZLEHTTP/GUZZLE - PROMISES use Psr\Http\Message\ResponseInterface as Res; $promise = $client->sendAsync($request);

    $promise->then(function (Res $response) { $response->getBody(); }); $promise->wait();
  10. GUZZLEHTTP/GUZZLE - MIDDLEWARES $middleware = function ($handler) { return function

    ($request, $options) use ($handler) { // Alter request, if you want return $handler($request, $options) ->then(function (ResponseInterface $response) { // Alter response, if you want return $response; }); }; }
  11. PHP-HTTP/HTTPLUG - SOLUTION interface HttpClient { public function sendRequest($request); }

    interface HttpAsyncClient { public function sendAsyncRequest($request); }
  12. PHP-HTTP/HTTPLUG - SOLUTION $guzzle = new GuzzleHttp\Client(); $adapter = new

    Http\Adapter\Guzzle5\Client($guzzle); $psrResponse = $adapter->sendRequest($psrRequest);
  13. PHP-HTTP/HTTPLUG - ADAPTERS guzzle6-adapter guzzle5-adapter guzzle4-adapter guzzle3-adapter zend2-adapter zend1-adapter cake-adapter

    buzz-adapter react-adapter socket-client fopen-adapter file-get-contents-adapter curl-client mock-client
  14. PHP-HTTP/HTTPLUG - COMPOSER.JSON "require": { - "guzzlehttp/guzzle": "^5.0", + "guzzlehttp/guzzle":

    "^6.0",
 - "php-http/guzzle5-adapter": "^0.1.0" + "php-http/guzzle6-adapter": "^0.1.0" }
  15. • http:/ /mwl.be • https:/ /github.com/guzzle/guzzle • https:/ /github.com/php-http •

    http:/ /docs.guzzlephp.org/en/latest/ • https:/ /github.com/php-fig/http-message • https:/ /github.com/php-fig/fig-standards/
 blob/master/accepted/PSR-7-http-message.md REFERENCES