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

PSR-7 — HTTP message interfaces

PSR-7 — HTTP message interfaces

PSR-7, trenutno najnoviji prihvaćeni PSR standard, definiše interfejse koji opisuju HTTP poruke i njihovo predstavljanje u PHP-u.

Zarko Stankovic

September 22, 2015
Tweet

Other Decks in Programming

Transcript

  1. PSR-7 Je trenutno najnoviji prihvaćeni PSR standard koji definiše interfejse

    koji opisuju HTTP poruke i njihovo predstavljanje u PHP-u.
  2. PRIHVAĆENI PSR-OVI 0 - Autoloading Standard 1 - Basic Coding

    Standard 2 - Coding Style Guide 3 - Logger Interface 4 - Autoloading Standard 7 - HTTP Message Interface
  3. U IZRADI 5 - PHPDoc Standard 8 - Huggable Interface

    9 - Security Disclosure 10 - Security Advisories
  4. PSR-7 Implementiran poštujući: RFC 7230 - Message Syntax and Routing

    RFC 7231 - Semantics and Content RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
  5. HTTP PORUKE Način komunikacije u HTTP protokolu. Osnova web razvoja

    Dve vrste poruka: 1. Zahtev (Request) 2. Odgovor (Response)
  6. REQUEST P O S T / p a t h

    H T T P / 1 . 1 H o s t : e x a m p l e . c o m f o o = b a r & b a z = b a t 1. Request line 2. Headers 3. Empty line 4. Message body
  7. RESPONSE H T T P / 1 . 1 2

    0 0 O K C o n t e n t - T y p e : t e x t / p l a i n T h i s i s t h e r e s p o n s e b o d y 1. Status line 2. Headers 3. Empty line 4. Message body
  8. PSR-7 MESSAGES P s r \ H t t p

    \ M e s s a g e \ M e s s a g e I n t e r f a c e Psr\Http\Message\RequestInterface Psr\Http\Message\ServerRequestInterface Psr\Http\Message\ResponseInterface
  9. e c h o $ r e q u e

    s t - > g e t M e t h o d ( ) ; / / " G E T " $ r e q u e s t - > w i t h M e t h o d ( ' P O S T ' ) ; e c h o $ r e q u e s t - > g e t M e t h o d ( ) ; / / G E T Pogrešno Poruke su imutabilne.
  10. e c h o $ r e q u e

    s t - > g e t M e t h o d ( ) ; / / " G E T " $ r e q u e s t = $ r e q u e s t - > w i t h M e t h o d ( ' P O S T ' ) ; e c h o $ r e q u e s t - > g e t M e t h o d ( ) ; / / P O S T Pravilno Korisitimo novu instancu dobijenu od mutator metode.
  11. Promena nad objektom ne utiče na originalni objekat. Kreiranje default

    request/response instanci koje mogu biti korišćeni kao osnove za kreiranje drugih poruka. Promenjeni objekat se mora eksplicitno zameniti sa prethodnim.
  12. Umesto f u n c t i o n (

    M v c E v e n t $ e ) { $ r e s p o n s e = $ e - > g e t R e s p o n s e ( ) ; $ r e s p o n s e - > s e t H e a d e r L i n e ( ' x - f o o ' , ' b a r ' ) ; }
  13. Eksplicitno zamenjujemo prethodnu instancu response sa novom f u n

    c t i o n ( M v c E v e n t $ e ) { $ r e s p o n s e = $ e - > g e t R e s p o n s e ( ) ; $ e - > s e t R e s p o n s e ( $ r e s p o n s e - > w i t h H e a d e r ( ' x - f o o ' , ' b a r ' ) ) ; }
  14. Case-insensitive header field names $ m e s s a

    g e = $ m e s s a g e - > w i t h H e a d e r ( ' f o o ' , ' b a r ' ) ; e c h o $ m e s s a g e - > g e t H e a d e r L i n e ( ' f o o ' ) ; / / O u t p u t s : b a r e c h o $ m e s s a g e - > g e t H e a d e r L i n e ( ' F O O ' ) ; / / O u t p u t s : b a r $ m e s s a g e = $ m e s s a g e - > w i t h H e a d e r ( ' f O O ' , ' b a z ' ) ; e c h o $ m e s s a g e - > g e t H e a d e r L i n e ( ' f o o ' ) ; / / O u t p u t s : b a z
  15. Implementacija omogućava pristup header-ima u vidu case- insensitive manira ali

    MORA poštovati originalni format prilikom poziva g e t H e a d e r s ( ) metode.
  16. Header-i sa više vrednosti $ m e s s a

    g e = $ m e s s a g e - > w i t h H e a d e r ( ' f o o ' , ' b a r ' ) - > w i t h A d d e d H e a d e r ( ' f o o ' , ' b a z ' ) ; $ h e a d e r = $ m e s s a g e - > g e t H e a d e r L i n e ( ' f o o ' ) ; / / $ h e a d e r c o n t a i n s : ' b a r , b a z ' $ h e a d e r = $ m e s s a g e - > g e t H e a d e r ( ' f o o ' ) ; / / [ ' b a r ' , ' b a z ' ] s t r i n g M e s s a g e I n t e r f a c e : : g e t H e a d e r L i n e ( ) s t r i n g [ ] M e s s a g e I n t e r f a c e : : g e t H e a d e r ( )
  17. Zašto ne pristupati "header bag-u" koji manipuliše header- ima? $

    r e q u e s t - > h e a d e r s - > s e t ( ' X - F o o ' , ' b a r ' ) ;
  18. LAW OF DEMETER $ n e w R e q

    u e s t = $ r e q u e s t - > w i t h H e a d e r ( ' X - F o o ' , ' b a r ' ) ;
  19. H o s t header Obično je identičan kao host

    komponenta URI-a ili kao host koji je korišćen prilikom uspostavljanja konekcija ali HTTP specifikacija dozvoljava da se razlikuje.
  20. Implementacija MORA pokušati da postavi H o s t header

    na osnovu URI-a ako header već ne postoji.
  21. Metod R e q u e s t I n

    t e r f a c e : : w i t h U r i ( U r i I n t e r f a c e $ u r i , $ p r e s e r v e H o s t = f a l s e ) će po default-u zameniti originalni H o s t sa H o s t header- om koji se nalazi u UriInterface instanci Moguće je promeniti ovo ponašanje koristeći drugi argument $ p r e s e r v e H o s t
  22. Telo poruke (message body) može biti malo ili jako veliko.

    Problemi sa preteranim konzumiranjem dostupne memorije jer je sadržaj pročitan i sačuvan kompletno u memoriji. Implementacija varira od veličine poruke.
  23. P s r \ H t t p \ M

    e s s a g e \ S t r e a m I n t e r f a c e Skriva implementacije operacija čitanja i pisanja stream-a. Implementacije mogu koristiti ugrađene PHP stream wrapper-e: p h p : / / m e m o r y i p h p : / / t e m p Nudi javne metode za proveru mogućnosti stream-a: i s R e a d a b l e ( ) , i s W r i t a b l e ( ) i i s S e e k a b l e ( ) _ _ t o S t r i n g ( ) vraća kompletan sadržaj tela odjedanput.
  24. P s r \ H t t p \ M

    e s s a g e \ U r i I n t e r f a c e "efektivni URL" je modelovan pomoću U r i I n t e r f a c e OOP pristup raznim delovima URI-a Definiše _ _ t o S t r i n g ( ) metodu za jednostavan string prikaz modelovanog URI-a
  25. Potrebno je definisati interfejs koji je specifičan za serversku stranu.

    Zahtevi koji su upućeni serveru pružaju više informacija o samom zahtevu upotrebom PHP-ovih SAPI-ja
  26. $ _ C O O K I E $ _

    G E T $ _ P O S T $ _ F I L E S $ _ S E R V E R
  27. P s r \ H t t p \ M

    e s s a g e \ S e r v e r R e q u e s t I n t e r f a c e OOP pristup superglobalima i lakša manipulacija istim Promoviše testiranje Definiše takozvane "atribute" koji služe za komunikaciju unutar same aplikacije.
  28. U p l o a d e d F i

    l e I n t e r f a c e [ ] S e r v e r R e q u e s t I n t e r f a c e : : g e t U p l o a d e d F i l e s ( )
  29. PHP informacije o upload-ovanim fajlovima čuva u $ _ F

    I L E S superglobalu. a r r a y ( ' a v a t a r ' = > a r r a y ( ' t m p _ n a m e ' = > ' p h p U x c O t y ' , ' n a m e ' = > ' m y - a v a t a r . p n g ' , ' s i z e ' = > 9 0 9 9 6 , ' t y p e ' = > ' i m a g e / p n g ' , ' e r r o r ' = > 0 , ) , )
  30. a r r a y ( ' f i l

    e s ' = > a r r a y ( ' n a m e ' = > a r r a y ( 0 = > ' f i l e 0 . t x t ' , 1 = > ' f i l e 1 . h t m l ' , ) , ' t y p e ' = > a r r a y ( 0 = > ' t e x t / p l a i n ' , 1 = > ' t e x t / h t m l ' , ) , / * e t c . * / ) , ) WTH!
  31. a r r a y ( ' f i l

    e s ' = > a r r a y ( 0 = > a r r a y ( ' n a m e ' = > ' f i l e 0 . t x t ' , ' t y p e ' = > ' t e x t / p l a i n ' , / * e t c . * / ) , 1 = > a r r a y ( ' n a m e ' = > ' f i l e 1 . h t m l ' , ' t y p e ' = > ' t e x t / h t m l ' , / * e t c . * / ) , ) , ) Očekivano...
  32. U p l o a d e d F i

    l e I n t e r f a c e kao rešenje! < i n p u t t y p e = " f i l e " n a m e = " a v a t a r " > / / S e r v e r R e q u e s t I n t e r f a c e : : g e t U p l o a d e d F i l e s ( ) a r r a y ( ' a v a t a r ' = > / * U p l o a d e d F i l e I n t e r f a c e i n s t a n c e * / )
  33. Rešenje ako je $_FILES prazan niz? Ako request method nije

    bio POST $_FILES će biti prazan. Unit testiranje (mock-ovanje fajlova) Non-SAPI okruženje (ReactPHP)
  34. n a m e s p a c e P

    s r \ H t t p \ M e s s a g e ; i n t e r f a c e M e s s a g e I n t e r f a c e { p u b l i c f u n c t i o n g e t P r o t o c o l V e r s i o n ( ) ; p u b l i c f u n c t i o n w i t h P r o t o c o l V e r s i o n ( $ v e r s i o n ) ; p u b l i c f u n c t i o n g e t H e a d e r s ( ) ; p u b l i c f u n c t i o n h a s H e a d e r ( $ n a m e ) ; p u b l i c f u n c t i o n g e t H e a d e r ( $ n a m e ) ; p u b l i c f u n c t i o n g e t H e a d e r L i n e ( $ n a m e ) ; p u b l i c f u n c t i o n w i t h H e a d e r ( $ n a m e , $ v a l u e ) ; p u b l i c f u n c t i o n w i t h A d d e d H e a d e r ( $ n a m e , $ v a l u e ) ; p u b l i c f u n c t i o n w i t h o u t H e a d e r ( $ n a m e ) ; p u b l i c f u n c t i o n g e t B o d y ( ) ; p u b l i c f u n c t i o n w i t h B o d y ( S t r e a m I n t e r f a c e $ b o d y ) ; }
  35. n a m e s p a c e P

    s r \ H t t p \ M e s s a g e ; i n t e r f a c e R e q u e s t I n t e r f a c e e x t e n d s M e s s a g e I n t e r f a c e { p u b l i c f u n c t i o n g e t R e q u e s t T a r g e t ( ) ; p u b l i c f u n c t i o n w i t h R e q u e s t T a r g e t ( $ r e q u e s t T a r g e t ) ; p u b l i c f u n c t i o n g e t M e t h o d ( ) ; p u b l i c f u n c t i o n w i t h M e t h o d ( $ m e t h o d ) ; p u b l i c f u n c t i o n g e t U r i ( ) ; p u b l i c f u n c t i o n w i t h U r i ( U r i I n t e r f a c e $ u r i , $ p r e s e r v e H o s t = f a l s e ) ; }
  36. n a m e s p a c e P

    s r \ H t t p \ M e s s a g e ; i n t e r f a c e R e s p o n s e I n t e r f a c e e x t e n d s M e s s a g e I n t e r f a c e { p u b l i c f u n c t i o n g e t S t a t u s C o d e ( ) ; p u b l i c f u n c t i o n w i t h S t a t u s ( $ c o d e , $ r e a s o n P h r a s e = ' ' ) ; p u b l i c f u n c t i o n g e t R e a s o n P h r a s e ( ) ; }
  37. n a m e s p a c e P

    s r \ H t t p \ M e s s a g e ; i n t e r f a c e S e r v e r R e q u e s t I n t e r f a c e e x t e n d s R e q u e s t I n t e r f a c e { p u b l i c f u n c t i o n g e t S e r v e r P a r a m s ( ) ; p u b l i c f u n c t i o n g e t C o o k i e P a r a m s ( ) ; p u b l i c f u n c t i o n w i t h C o o k i e P a r a m s ( a r r a y $ c o o k i e s ) ; p u b l i c f u n c t i o n g e t Q u e r y P a r a m s ( ) ; p u b l i c f u n c t i o n w i t h Q u e r y P a r a m s ( a r r a y $ q u e r y ) ; p u b l i c f u n c t i o n g e t U p l o a d e d F i l e s ( ) ; p u b l i c f u n c t i o n w i t h U p l o a d e d F i l e s ( a r r a y $ u p l o a d e d F i l e s ) ; p u b l i c f u n c t i o n g e t P a r s e d B o d y ( ) ; p u b l i c f u n c t i o n w i t h P a r s e d B o d y ( $ d a t a ) ; p u b l i c f u n c t i o n g e t A t t r i b u t e s ( ) ; p u b l i c f u n c t i o n g e t A t t r i b u t e ( $ n a m e , $ d e f a u l t = n u l l ) ; p u b l i c f u n c t i o n w i t h A t t r i b u t e ( $ n a m e , $ v a l u e ) ;
  38. n a m e s p a c e P

    s r \ H t t p \ M e s s a g e ; i n t e r f a c e S t r e a m I n t e r f a c e { p u b l i c f u n c t i o n _ _ t o S t r i n g ( ) ; p u b l i c f u n c t i o n c l o s e ( ) ; p u b l i c f u n c t i o n d e t a c h ( ) ; p u b l i c f u n c t i o n g e t S i z e ( ) ; p u b l i c f u n c t i o n t e l l ( ) ; p u b l i c f u n c t i o n e o f ( ) ; p u b l i c f u n c t i o n i s S e e k a b l e ( ) ; p u b l i c f u n c t i o n s e e k ( $ o f f s e t , $ w h e n c e = S E E K _ S E T ) ; p u b l i c f u n c t i o n r e w i n d ( ) ; p u b l i c f u n c t i o n i s W r i t a b l e ( ) ; p u b l i c f u n c t i o n w r i t e ( $ s t r i n g ) ; p u b l i c f u n c t i o n i s R e a d a b l e ( ) ;
  39. n a m e s p a c e P

    s r \ H t t p \ M e s s a g e ; i n t e r f a c e U p l o a d e d F i l e I n t e r f a c e { p u b l i c f u n c t i o n g e t S t r e a m ( ) ; p u b l i c f u n c t i o n m o v e T o ( $ t a r g e t P a t h ) ; p u b l i c f u n c t i o n g e t S i z e ( ) ; p u b l i c f u n c t i o n g e t E r r o r ( ) ; p u b l i c f u n c t i o n g e t C l i e n t F i l e n a m e ( ) ; p u b l i c f u n c t i o n g e t C l i e n t M e d i a T y p e ( ) ; }
  40. n a m e s p a c e P

    s r \ H t t p \ M e s s a g e ; i n t e r f a c e U r i I n t e r f a c e { p u b l i c f u n c t i o n g e t S c h e m e ( ) ; p u b l i c f u n c t i o n g e t A u t h o r i t y ( ) ; p u b l i c f u n c t i o n g e t U s e r I n f o ( ) ; p u b l i c f u n c t i o n g e t H o s t ( ) ; p u b l i c f u n c t i o n g e t P o r t ( ) ; p u b l i c f u n c t i o n g e t P a t h ( ) ; p u b l i c f u n c t i o n g e t Q u e r y ( ) ; p u b l i c f u n c t i o n g e t F r a g m e n t ( ) ; p u b l i c f u n c t i o n w i t h S c h e m e ( $ s c h e m e ) ; p u b l i c f u n c t i o n w i t h U s e r I n f o ( $ u s e r , $ p a s s w o r d = n u l l ) ; p u b l i c f u n c t i o n w i t h H o s t ( $ h o s t ) ; p u b l i c f u n c t i o n w i t h P o r t ( $ p o r t ) ;
  41. Moguć rad sa ugrađenim stream wrapper-ima ali nije jednostavan. Određene

    biblioteke potrebne za rad (cURL) Projekti imaju svoju HTTP apstrakciju Direktan pristup superglobalima Projekti se oslanjaju na sopstvene implementacije Neki projekti su prinuđeni da prave adaptere ukoliko žele da koriste implementaciju drugog projekta
  42. POSTIGNUTI CILJEVI Apstraktni opis HTTP poruka Projekti mogu međusobno da

    dele biblioteke PHP Ekosistem Implementacija middleware-a u PHP-u
  43. PROJEKTI KOJI KORISTE PSR-7 Zend Diactoros - https://github.com/zendframework/zend-diactoros Zend Stratigility

    - https://github.com/zendframework/zend-stratigility Symfony2 PSR-7 bridge - http://symfony.com/blog/psr-7- support-in-symfony-is-here
  44. MATERIJAL ZA ČITANJE http://www.php-fig.org/psr/psr-7/ https://github.com/phly/psr7examples Matthew Weier O'Phinney - https://mwop.net

    https://www.mnot.net/blog/2014/06/07/rfc2616_is_dead https://groups.google.com/forum/? fromgroups#!forum/php-fig