Saga do programador

14Jan/101

Cliente para Restfulie C#

No final do ano passado o Guilherme Silveira da Caelum , lançou a api Restfulie.
Basicamente o Restfulie implementa as idéias do Jim Webber e Ian Robson em relação a media types que suportam hipermídia, content negotiation e muito mais relacionado a Rest.
Este projeto fez bastante barulho na comunidade, inclusive recebendo elogios do próprio Jim.

O Restfulie teve sua versão original implementada em ruby e logo depois foi lançada a versão para Java, mas ainda não havia nenhuma versão para .Net. Foi então que eu e o Sergio Junior aqui do blog resolvemos escrever uma versão para C# da api.
Começamos a implementar a parte cliente do Restfulie e fizemos isto utilizando as características dinâmicas da versão 4.0 do C#.
A idéia é que podemos fazer o client em C# bem próximo da idéia inicial que foi escrita em Ruby.

Aqui vamos mostrar alguns exemplos de utilização desta versão em C#.
Um recurso Pedido pode ter sua representação em xml como a que segue:

<pedido>
        <data>26/12/2009 11:40</data>
        <total>300.00</total>
	<atom:link rel="refresh"
          href="http://www.caelum.com.br/pedidos/1"
          xmlns:atom="http://www.w3.org/2005/Atom"/>
        <atom:link rel="update"
          href="http://www.caelum.com.br/pedidos/1"
          xmlns:atom="..."/>
        <atom:link rel="pagar"
		  href="http://www.caelum.com.br/pedidos/1/pagar"
          xmlns:atom="..."/>
        <atom:link rel="excluir"
          href="http://www.caelum.com.br/pedidos/1
          xmlns:atom="..."/>
         <atom:link rel="GetCliente"
          href="http://www.caelum.com.br/pedidos/1/cliente
          xmlns:atom="..."/>
</pedido>

Respare que a representação deste recurso além de conter  os dados do recurso, possui também  todas as possíveis transições de estado do recurso.
Além  disso, ainda é possível seguir os links e obter outros recursos relacionados: este é o conceito de Hipermedia tanto utilizado na web humana.

Utilizando o Restfulie client C#

Primeiro começamos fazendo o download da DLL e então para obter a representação de um recurso em C#, podemos utilizar algo bem parecido com ruby, o acesso a um entry point:

dynamic  pedido = Restfulie.At(“www.caelum.com.br/pedidos/1.xml).Get();

Uma vez com a representação do recurso em mãos, podemos obter as informações do mesmo e seguir seus links.

Console.WriteLine(
   string.format(“O valor total do pedido é:{0}”, pedido.Total ) );
Console.WriteLine(
   string.format(“A data do pedido é: {0}”, pedido.Data) );

É possível invocar métodos e alterar o estado do pedido, além de navegar em suas relações com outros recursos.

   pedido.Pagar();
   pedido.Cancelar();
   pedido.Excluir();

Estas chamadas de métodos são remotas, baseadas nos links fornecidos pelo xml e nos protocolos http e media types bem conhecidos.
Para recuperar um recurso relacionado através dos links:

  dynamic cliente = pedido.GetCliente();
  Console.WriteLine(
     string.format(“Nome do cliente {0}”, cliente.nome));

Ainda podemos obter as informações sobre sua resposta web, para analisar headers ou response codes:

  Console.WriteLine(pedido.WebResponse.StatusCode);

As vezes a representação xml do recurso pode conter tags com o caracter “-”.
Por exemplo:

<city>
    <name>Sao Paulo</name>
    <population>
         <size>18000000</size>
         <growth>10</growth>
    </population>
    <updated-at>10/01/2010</updated-at>
    <link rel="next_largest" href="http://localhost:3000/cities/18.xml" />
</city>

Obtendo o recurso:

dynamic city = Restfulie.At(“http://localhost:3000/cities/17.xml”).Get();

Acessando o atributo “update-at”:

  Console.WriteLine(
     string.format(“A data de atualização é {0}”,city.Update_At));
  Console.WriteLine(
     string.format(“População {0}”, city.Population.size));

Note que em na vesão C#, não acessamos o atributo update-at com caracter “-”, este é substituído por “_”. Então quando for necessário acessar um atributo ou método que utilize o “-”, substituída por “_”.
Com as novas capacidades dinâmicas do C# 4.0, conseguimos atingir um resultado bem próximo ao que é possível na versão ruby.
Aqui segue um comparativo básico:

Em Ruby:

  pedido = Restfulie.at(“http://restfulie-test.heroku.com/orders/14).get
  puts pedido.customer-name
  pedido.cancel

Em C#

  pedido = Restfulie.At(“http://restfulie-test.heroku.com/orders/14.xml”).Get();
  Console.WriteLine(pedido.customer_name);
  pedido.Cancel();

Por enquanto só temos a versão do client em C#. Ainda falta uma série de features a serem implementadas. No site do projeto, tem uma lista de coisas que necessitam de ser feitas no cliente
para que ele fique tão maduro quanto as versões em ruby ou Java. Vamos continuar trabalhando no cliente para isso.

Se você está interessado em ajudar neste projeto, deixe um comentário ou mande um e-mail para nós.

Para saber mais:

http://github.com/caelum/restfulie-csharp
http://restfulie.caelumobjects.com/

Para saber mais sobre as idéias por trás do Restfulie, segue o link do artigo na infoq.
http://www.infoq.com/articles/webber-rest-workflow

Até a Próxima
Luiz Costa
Sérgio Júnior.

Sobre Luiz Costa

Desenvolvedor e blogueiro
Comentários (1) Trackbacks (0)
  1. Otimo trabalho! Vcs estão de parabens.


Deixar um comentário


Sem trackbacks