quinta-feira, 7 de março de 2013

Rest em PHP


Oque é REST???

É um estilo de arquitetura para desenvolver aplicações web.

Como?

A idéia é simples, utilizar o protocolo HTTP que já temos e conhecemos, para desenvolver aplicações que possam ser “lidas” tanto por pessoas quanto por computadores.
Ok, vamos começar a falar sobre webservices então.
REST diz que uma página não é um recurso, e sim a representação de um recurso.
Ou seja, uma página web não é um recurso, e sim a representação de um, no formato HTML.
http://meusite.com/produtos/111
O protocolo HTTP, já possui todos os recursos que precisamos, então não precisamos fazer algo assim:
http://meusite.com/produtos/11/edit <- Isso não é legal
Para mostrar que queremos alterar algo.
As URLs, devem ser hierárquicas! Ou seja, /edit é filho de produto? Eu acho que não.
Mas uma lista de fotos é!
http://meusite.com/produtos/11/fotos
Lindo, não? 
Mas como eu faço para mostrar que quero alterar um produto então?
HTTP possui vários métodos, e REST diz que as ações são implícitas por esses métodos, e não passando a ação na URL.
GET
POST
PUT
DELETE
Esses são os métodos HTTP usados para construir apps RESTful.


 GET http//meusite.com/produtos  
 Lista os produtos.  
 POST http//meusite.com/produtos  
 Adiciona um produto.  
 GET http//meusite.com/produtos/1  
 Mostra um produto específico.  
 PUT http//meusite.com/produtos/1  
 Altera um produto específico.  
 DELETE http//meusite.com/produtos/1  
 Deleta o produto.  



Simples, não???
Agora vamos a questão de “representar” esses produtos
Esses produtos podem ser representados como?
HTML, JSON, XML, JPG, ...
E isso não precisa ser passado na URL.
http://meusite.com/produtos.xml <- Você não precisa deixar isso explícito!
O HTTP faz isso por você!
Para isso existe o cabeçalho Accept, com ele você fala “implícitamente” como você quer a representação desse produtos.
 Accept  text/html,application/json  



Entenderam???
Vamos colocar a mão na massa então!
Para fazer isso, vou usar um cara bem legal chamado Respect\Rest. Com ele fica muito fácil desenvolver apps RESTful em PHP.
http://github.com/Respect/Rest


 $router = new Router();  
 $router->get('/produtos', function() {  
   return 'Listagem de produtos';  
 });  
 $router->post('/produtos', function() {  
   return 'Criando um produto';  
 });  
 $router->get('/produtos/*', function() {  
   return 'Mostrando um produto específico';  
 });  
 $router->put('/produtos/*', function() {  
   return 'Alterando um produto';  
 });  
 $router->delete('/produtos/*', function() {  
   return 'Apagando um produto';  
 });  



Simples neh?
Agora vamos dizer de que formas esses produtos podem ser representados.


 $router = new Router();  
 $router->get('/produtos', function() {  
   return 'Listagem de produtos';  
 })->accept(  
   array(  
     'text/html' => function($data) {  
       return 'Produto em HTML';  
     },  
     'application/json' => function($data) {  
       return 'Produto em JSON';  
     }  
   )  
 );  
 $router->post('/produtos', function() {  
    return 'Criando um produto';  
 });  
 $router->get('/produtos/*', function() {  
   return 'Mostrando um produto específico';  
 });  
 $router->put('/produtos/*', function() {  
   return 'Alterando um produto';  
 });  
 $router->delete('/produtos/*', function() {  
   return 'Apagando um produto';  
 });  

Está pronto! Agora, a lista de produtos pode ser representada em JSON e HTML.