Pesquisar

segunda-feira, 14 de janeiro de 2008

REST - Breves esclarecimentos sobre o estilo arquitetural

Primeiro esclarecimento:
REST é um estilo arquitetural (simples assim), que pode ser aproveitado para o desenvolvimento de aplicações que utilizem uma rede de comunicação, o termo foi "inventado" por Roy Fielding na dissertação de Ph.D dele.

Segundo esclarecimento:
REST não é um padrão, especificação, ou seja, você não irá ver a Sun, Microsoft ou IBM vendendo um Toolkit para REST. Simplesmente REST é um estilo arquitetural, você pode compreender-lo e desenvolver seus serviços para web (aplicações, web services ...) nesse estilo.

Um exemplo do uso deste estilo arquitetural (REST)

A Web...
Você deseja um serviço, por exemplo um dicionário online.
Você procura esse dicionário (normalmente usando outro serviço de busca da Web).
Como resposta você obtém uma URL que identifica unicamente aquele recurso (serviço). [ www.dicionariorest.com.br].
Pronto agora você consegue tal serviço.

Um ótimo jeito é dar outro exemplo

Uma empresa Xyz deseja oferecer serviços na web que habilitam seus clientes a:

1 - Obter uma lista de produtos.
2 - Obter informação detalhada sobre um produto.
3 - Comprar usando a Internet.

Como seria o jeito REST de se resolver isto.

O serviço está disponível pela URL (única), no exemplo o cliente do serviço deve usar a URL para ter acesso ao serviço.
www.lojadementira.com.br/produtos
O retorno óbvio é uma lista de produtos (HTML) todavia poderia ser especificado qual o tipo de recurso queriamos, por exemplo.
www.lojadementira.com.br/produtos&tipo=xml
Supondo que o serviço retornasse o seguinte xml:

[?xml version="1.0"?]
[lista]
[produto id=www.lojadementira.com.br/produtos/001][/produto]
[produto id=www.lojadementira.com.br/produtos/002][/produto]
[produto id=www.lojadementira.com.br/produtos/003][/produto]
[produto id=www.lojadementira.com.br/produtos/004][/produto]
[produto id=www.lojadementira.com.br/produtos/005][/produto]
[produto id=www.lojadementira.com.br/produtos/006][/produto]
[/lista]


Não reparem na sintaxe (provavelmente) errada do xml acima. Notem a característica chave do REST: A lista própria já traz como acessar o serviço de detalhes do produto. O cliente se transfere de um estado para o próximo examinando e escolhendo entre as alternativas.

Ótimo agora com a lista, o cliente escolhe o produto [www.lojadementira.com.br/produtos/005] e como retorno obtém um novo xml.

[?xml version="1.0"?]
[produto id=1]
[name] tutorial sobre REST [/name]
[price]18.8[/price]
...
[/produto]

(ps: claro que www.lojadementira.com.br/produtos/005 não é se trata do endereço físico da página html www.lojadementira.com.br/produtos/005.html, é somente um modo de acessar unicamente aquele recurso, todavia essa descrição detalhada do produto pode (e deveria) ser dinâmica.)

Algumas características do REST (baseada em redes)

* Geralmente usam-se interfaces unificadas.
GET, POST, PUT e DELETE par prover serviços.
* Stateless: Toda requisição precisa conter toda informação necessária para atender a requisição.
* Tudo é um recurso e tudo é adiquirido/executado pela URL.


Principios do REST
* Dê a tudo (os recursos) um ID (URI)
* Link tudo
Por exemplo um pedido:
[order self='http://example.com/customers/1234' ]
[amount]23[/amount]
[product ref='http://example.com/products/4554' /]
[customer ref='http://example.com/customers/1234' /]
[/order]


Nesse pedido posso facilmente encontrar os recursos relacionados a ele, como cliente e produto.

* Use métodos padrões


Se tudo é um recurso com identidade...

class Resource {
Resource(URI u);
Response get();
Response post(Request r);
Response put(Request r);
Response delete();
}

Exemplo número 9.001

Supondo as seguintes classes de serviço:

public class ServicoGerenciamentoDeProduto{
+getDetalhesDoProtudo()
+atualizarProduto()
+inserirProduto()
...
}

public class ServicoGerenciamentoDeCliente{
+getTelefoneComercial()
+atualizarCliente()
+inserirCliente()
...
}

Num modo REST de resolução poderia ser criado algo semelhando a isso.

interface Resource{
+GET
+PUT
+POST
+DELETE
}

E fazer as classes de serviço implementarem essa interface (um dos princípios sobre a padronização). Essa implementação é por recurso, normalmente um serviço expõem mais de um recurso.


Desculpem pela quantidade de exemplos mas o assunto é muito "abstrato" ou no mínimo díficil de se explicar, acredito que com exemplos ficará mais claro.

Conclusão.

Francamente gostaria de ter deixado mais claro o que é REST e como aplicar, mas estou achando que não consegui, assuntos sobre estilos arquiteturais são complexos de ser entendidos e explicados. Talvez uma leitura nos links abaixo facilite o entendimento. Enfim usar REST é apenas utilizar melhor o jeito HTTP de ser.


Fontes e bons links:
http://www.xfront.com/
http://www.fragmental.com.br/
http://rest.blueoxen.net/cgi-bin/wiki.pl?BenjaminsRESTTutorial
http://forum.rubyonbr.org/forums/1/topics/2212#posts-12150
http://java.sun.com/developer/technicalArticles/WebServices/restful/
A Brief Introduction to REST by Stefan Tilkov


Ps: não se trata de um tutorial ou faq sobre o assunto. Possivelmente há erros no texto, qualquer correção ou adição de informação será bem-vinda.

Nenhum comentário: