Mais sobre Restfulie

Posted on November 23, 2009

0


As vezes para executar uma operação precisamos analizar diversos estados de um recurso, fazer diversas requisições, analizar parametros, etc. Tudo isso por nao termos a real informação do que é possivel fazer com aquele recurso no estado atual em que ele se encontra.

Se ao pedir por um recurso que se encontra em qualquer servidor web, o xml retornado fosse um pouco mais dinâmico, inteligente suficiente para fornecer não todas as possibilidades de operações que aquele recurso possui em diversos estados, mas sim aquelas possíveis no estado atual do objeto, então diversas requisições ou análises seriam poupadas, permitindo com certeza execurtar as operações que naquele momento realmente importam.

server-side

O servidor aqui é responsável por disponibilizar um xml do recurso solicitado, (o que o cliente vai fazer com essas informações veremos adiante). O rails já automaticamente consegue renderizar os dados básicos do objetos solicitado, teriamos normalmente alogo do tipo:

Mas queremos disponibilizar aqui um pouco mais de informações. Um pedido pode ter sido pago ou não. Isso caracteriza o estado dessa informação, que muda totalmente o que podemos fazer com esse recurso.

Se o pedido já foi pago, podemos por exemplo liberar a funcionalidade de envia-lo para os correios, enquanto se ele não foi pago ainda não podemos liberar essa funcionalidade.

Isso é uma máquina de estados, determindos estados podem ser atingidos dependendo do estado atual do recurso.

Supondo que nosso pedido já foi pago e que é possível chamar a ação de despachar para os correios seria ideal que o xml retornado tivesse um pouco mais de informações, como por exemplo:

Ou seja, o cliente tem no xml recebido todas as informações necessarias sobre o que pode fazer com aquele recurso naquele momento, evitando por exemplo requisições desnecessárias ao servidor ou mesmo chamadas erradas de metodos.

E como defino esses estados ?

Obviamente o Rails não gera essa informação a mais que queremos no xml e é ai que entra o Restfulie. O Restfulie sobrescreve a geracao do xml padrão do Rails, adicionando informações em tempo real sobre o estado do objeto solicitado.

Tutorial

Vamos criar nossa aplicacao para fazer o teste:
rails restfulie_server

Abra o arquivo config/environment.rb e adicione:

Atualize fazendo:
rake gems:install

Já temos uma aplicação base com a gem do Restfulie instalada. Precisamos do recurso “Pedido” para fazer os testes. Vamos criá-lo com scaffold para facilitar o exemplo:

script/generate scaffold pedido preco:float descricao:string status:string

Status ?

Esse é um campo obrigatório no Restfulie atualmente. Para definir o que seu recurso pode liberar em tempo real, ele precisa ter um status. Por exemplo, para liberar o “despachar” do nosso pedido o status dele deve ser “pago”.
O status de pago poderia ainda lberar outras acoes em cima do recurso, como baixar o estoque
por exemplo, tudo dependendo da sua regra de negócio.

Definindo o estado

O Restfulie vai procurar pelo método “following_transitions” para saber o que colocar no xml em tempo real. Abra o arquivo models/pedido.rb e adicione:

Pronto! É disso que precisamos para em tempo real saber quando é possível despachar ou não nosso pedido, a url http://servidor/pedido/1 deve agora mostrar o seguinte resultado:

Podemos executar no cliente a chamada a esse recurso. O Restfulie devolverá um objeto serializado contendo os métodos possíveis para aquele estado:

Ao chamar “p.despachar” a action despachar do PedidosController será executada.

Mais utilizações

Informação certa no momento certo, o recurso disponibiliza seu estado verdadeiro atraves do Restfulie. É possivel fazer uma série de configurações ainda no Restfuliepara deixar sua maquina de estados corretamente implementada, configurar actions que não são padrão, etc. Além disso a parte do client também é facilitada com o Restfulie, mas isso fica para um próximo post.

Posted in: rails, ruby