Slide 1

Slide 1 text

HTTP messages Modern way of dealing with HTTP in PHP @hannesvdvreken #confoo

Slide 2

Slide 2 text

Hi, my name is Hannes.

Slide 3

Slide 3 text

!

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

PSR-7 Common interfaces for HTTP messages

Slide 7

Slide 7 text

1. psr/http-message 2. Server side 3. Client side

Slide 8

Slide 8 text

1. psr/http-message

Slide 9

Slide 9 text

HTTP application PSR/HTTP-MESSAGE

Slide 10

Slide 10 text

PHP Script: $_SERVER - $_GET - $_POST - $_COOKIES - $_FILES PSR/HTTP-MESSAGE

Slide 11

Slide 11 text

Frameworks Zend, Symfony, Laravel, Silex, CakePHP, … PSR/HTTP-MESSAGE

Slide 12

Slide 12 text

composer require symfony/http-foundation composer require zendframework/zend-http PSR/HTTP-MESSAGE (RFC 7230 - 7231)

Slide 13

Slide 13 text

Example: Middleware that checks Authorization header from Request PSR/HTTP-MESSAGE

Slide 14

Slide 14 text

Example: Image library that generates a Response object for an image path PSR/HTTP-MESSAGE

Slide 15

Slide 15 text

Example: $response->send(); PSR/HTTP-MESSAGE

Slide 16

Slide 16 text

Example: symfony/http-foundation: RequestStack::class ExpressionRequestMatcher::class PSR/HTTP-MESSAGE

Slide 17

Slide 17 text

PSR/HTTP-MESSAGE PHP-FIG

Slide 18

Slide 18 text

Common interfaces for HTTP messages (RFC 7230 - 7231) PSR/HTTP-MESSAGE

Slide 19

Slide 19 text

Common interfaces for HTTP messages - Works in any Framework - Both for HTTP Clients and HTTP applications - HTTP version independent PSR/HTTP-MESSAGE

Slide 20

Slide 20 text

Common interfaces for HTTP messages RequestInterface ResponseInterface PSR/HTTP-MESSAGE

Slide 21

Slide 21 text

PSR/HTTP-MESSAGE May 2015: PSR-7 psr/http-message

Slide 22

Slide 22 text

Differences with Symfony HTTP foundation: Interfaced PSR/HTTP-MESSAGE

Slide 23

Slide 23 text

Differences with Symfony HTTP foundation: Interfaced Immutable PSR/HTTP-MESSAGE

Slide 24

Slide 24 text

$newRequest = $request ->withoutHeader($xHeader) ->withHeader(‘referer’, $referer); var_dump($newRequest === $request); > false PSR/HTTP-MESSAGE

Slide 25

Slide 25 text

PSR/HTTP-MESSAGE let’s take a look

Slide 26

Slide 26 text

PSR/HTTP-MESSAGE GET /try-the-api HTTP/1.1 Host: getstream.io HTTP/1.1 200 OK Date: Fri, 09 Mar 2018 14:4

Slide 27

Slide 27 text

PSR/HTTP-MESSAGE GET /try-the-api HTTP/1.1 Host: getstream.io HTTP/1.1 200 OK Date: Fri, 09 Mar 2018 14:4

Slide 28

Slide 28 text

PSR/HTTP-MESSAGE GET /try-the-api HTTP/1.1 Host: getstream.io HTTP/1.1 200 OK Date: Fri, 09 Mar 2018 14:4

Slide 29

Slide 29 text

PSR/HTTP-MESSAGE GET /try-the-api HTTP/1.1 Host: getstream.io HTTP/1.1 200 OK Date: Fri, 09 Mar 2018 14:4

Slide 30

Slide 30 text

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(); … }

Slide 31

Slide 31 text

PSR/HTTP-MESSAGE interface RequestInterface implements MessageInterface { function getRequestTarget(); function getUri(); function getMethod(); } interface ResponseInterface implements MessageInterface { function getStatusCode(); function getReasonPhrase(); }

Slide 32

Slide 32 text

PSR/HTTP-MESSAGE $newRequest = $request ->withHeader($name, $value); var_dump($newRequest === $request); > false

Slide 33

Slide 33 text

PSR/HTTP-MESSAGE - RECAP MessageInterface RequestInterface ResponseInterface UriInterface ServerRequestInterface ($_GET, $_POST, $_SERVER, $_COOKIES, $ StreamInterface

Slide 34

Slide 34 text

PSR/HTTP-MESSAGE guzzlehttp/psr7 zendframework/zend-diactoros slim/slim

Slide 35

Slide 35 text

2. Server side

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

START USING PSR-7 IN YOUR APP What about existing Symfony/Zend Request & Response objects?

Slide 38

Slide 38 text

START USING PSR-7 IN YOUR APP symfony/psr-http-message-bridge zendframework/zend-psr7bridge

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

START USING PSR-7 IN YOUR APP Symfony request/response object ⁷ ⁷ ⁷ Zend-Diactoros request/response object \Psr\Http\Message\RequestInterface type hinted

Slide 41

Slide 41 text

START USING PSR-7 IN YOUR APP Laravel: public function index(ServerRequestInterface $request){ return $psrResponse; }

Slide 42

Slide 42 text

START USING PSR-7 IN YOUR APP SlimPHP v3: routing & middleware

Slide 43

Slide 43 text

Middleware wrapping HTTP applications

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

MIDDLEWARE DEFINITION Session Logging Authentication Robots.txt file HTTP Cache Firewall Cors Throttling …

Slide 46

Slide 46 text

HTTP MIDDLEWARE PSR-15

Slide 47

Slide 47 text

MIDDLEWARE DEFINITION interface RequestHandlerInterface { public function handle(
 ServerRequestInterface $request
 ): ResponseInterface; }

Slide 48

Slide 48 text

MIDDLEWARE DEFINITION interface MiddlewareInterface { public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface; }

Slide 49

Slide 49 text

MIDDLEWARE DEFINITION function process( ServerRequestInterface $request, RequestHandlerInterface $handler ) { // Alter request, if you want $response = $handler->handle($request); // Alter response, if you want return $response; }

Slide 50

Slide 50 text

MIDDLEWARE DEFINITION Build your stack with: relay/relay mindplay/middleman …

Slide 51

Slide 51 text

Demo

Slide 52

Slide 52 text

https://github.com/php-fig/http-server-middleware HTTP MIDDLEWARE - PSR-15

Slide 53

Slide 53 text

3. Client side

Slide 54

Slide 54 text

GUZZLEHTTP/GUZZLE composer req guzzlehttp/guzzle

Slide 55

Slide 55 text

GUZZLEHTTP/GUZZLE composer.json ^6.3

Slide 56

Slide 56 text

Slide 57

Slide 57 text

GUZZLEHTTP/GUZZLE - WHAT’S NEW PSR-7

Slide 58

Slide 58 text

GUZZLEHTTP/GUZZLE - PSR-7 guzzlehttp/psr7

Slide 59

Slide 59 text

GUZZLEHTTP/GUZZLE - PSR-7 - COMPOSER.JSON "provide": { "psr/http-message-implementation": "1.0" },

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

GUZZLEHTTP/GUZZLE - PSR-7 use GuzzleHttp\Psr7\Request; $psrRequest = new Request( 'GET', $uri, $headers, $body );

Slide 63

Slide 63 text

GUZZLEHTTP/GUZZLE - PSR-7 $client = new GuzzleHttp\Client(); $psrResponse = $client->send($psrRequest);

Slide 64

Slide 64 text

GUZZLEHTTP/GUZZLE Demo

Slide 65

Slide 65 text

GUZZLEHTTP/GUZZLE - PROMISES Promises

Slide 66

Slide 66 text

GUZZLEHTTP/GUZZLE - PSR-7 guzzlehttp/promise

Slide 67

Slide 67 text

GUZZLEHTTP/GUZZLE - PROMISES use Psr\Http\Message\ResponseInterface as Res; $promise = $client->sendAsync($request); $promise->then(function (Res $response) { $response->getBody(); }); $promise->wait();

Slide 68

Slide 68 text

GUZZLEHTTP/GUZZLE Demo

Slide 69

Slide 69 text

GUZZLEHTTP/GUZZLE - MIDDLEWARES Callable middlewares

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

GUZZLEHTTP/GUZZLE - MIDDLEWARES $middleware = GuzzleHttp\Middleware::log( $psr3Logger, new GuzzleHttp\MessageFormatter() );

Slide 72

Slide 72 text

GUZZLEHTTP/GUZZLE - MIDDLEWARES $stack = HandlerStack::create(); $stack->push($middleware); $stack->unshift($middleware); $stack->remove($middleware); $client = new Client(['handler' => $stack]);

Slide 73

Slide 73 text

GUZZLEHTTP/GUZZLE - MIDDLEWARES Demo

Slide 74

Slide 74 text

Decoupling HTTP Clients

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

interface ClientInterface {
 public function sendRequest(
 RequestInterface $request
 ): ResponseInterface; }

Slide 77

Slide 77 text

RECAP 1. Guzzle PSR-7 2. Promises 3. Middleware 4. Client abstraction

Slide 78

Slide 78 text

RECAP 1. psr/http-message 2. Server side 3. Client side

Slide 79

Slide 79 text

Thank you! @hannesvdvreken #confoo

Slide 80

Slide 80 text

Time for questions. @hannesvdvreken #confoo

Slide 81

Slide 81 text

• https://getstream.io • 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