Motivação

Atualmente, com a crescente necessidade de distribuir conteúdo entre diferentes plataformas e integrar aplicações desenvolvidas com diferentes linguagens/frameworks, a utilização de web services RESTful vem se tornando uma prática bastante comum.

No mundo .NET, o framework NancyFx tem se mostrado uma opção bastante viável para a construção desse tipo de serviço, uma vez que oferece os mesmos recursos que o ASP.NET Web API (principal framework com essa finalidade no .NET), mas possui uma arquitetura mais customizável e simples.

Saiba mais sobre o ASP.NET Web API

O que é NancyFx?

NancyFx é um framework para construção de serviços baseados no protocolo HTTP. Ele foi inspirado em um projeto para a linguagem Ruby chamado Sinatra, de onde também veio a sugestão para o seu nome: uma homenagem a Nancy, filha do cantor Frank Sinatra. Trata-se de um projeto open source planejado para trabalhar com requisições HTTP (como GET, POST, DELETE e PUT) de uma forma bastante simples.

Entre as principais vantagens desse framework estão um mecanismo de Injeção de Dependência bastante eficiente, e o perfil altamente customizável da sua estrutura. Ele é projetado, por exemplo, para permitir a substituição de componentes em qualquer parte da aplicação. Assim, podemos usar facilmente View Engines, Custom Binders, Serializadores, ou podemos construir a nossa própria NancyEngine, mudando a forma que o NancyFx trata as solicitações.

Saiba mais sobre o framework NancyFx

Template de projeto do NancyFX

Para criarmos um novo projeto com o NancyFx, precisamos primeiramente baixar o seu template para o Visual Studio no link https://goo.gl/f7ros4. Ao clicar em Obter agora, será feito o download do arquivo Nancy.Templates.vsix, sobre o qual basta dar dois cliques para executar a instalação.

Com o template instalado, vamos criar agora um novo projeto. Para isso, acesse o menu File>New>Project e na categoria Web selecione o template Nancy Application with ASP .NET Hosting. A Figura 1 mostra a estrutura que é gerada para esse tipo de projeto.


Figura 1. Estrutura do projeto NancyFx

O template do NancyFx foi baseado na estrutura inicial de um projeto ASP.NET MVC, por isso possui várias pastas em comum, como a Content, na qual devemos adicionar os arquivos CSS e as imagens do projeto. Já na pasta Views, encontramos os arquivos de extensão .sshtml, que trabalham da mesma forma que os arquivos .cshtml com Razor. Temos, ainda, mais dois arquivos: o Bootstrapper.cs para as configurações; e o IndexModule.cs, que trabalha da mesma forma que um controller. A diferença é que no NancyFx esses componentes são chamados de módulos.

Criando um serviço RESTful com NancyFx

Para implementarmos nosso primeiro serviço RESTful com NancyFx, iniciaremos criando uma entidade que será trafegada entre o servidor e os clientes. Para isso, vamos criar uma nova pasta na nossa solution chamada Model e dentro dela, uma classe chamada Pessoa, cujo código pode ser visto na Listagem 1.


  01 public class Pessoa
  02 {
  03      public int Id { get; set; }
  04      public string Nome { get; set; }
  05 }
Listagem 1. Entidade Pessoa

Em seguida, precisamos configurar o nosso módulo IndexModule para retornar uma lista de pessoas. O código final dessa classe pode ser visto na Listagem 2.


  01    public class IndexModule : NancyModule
  02    {
  03        private static List<Pessoa> _pessoas = new List<Pessoa>();
  04
  05        public IndexModule()
  06        {
  07
  08           Get["/"] = _ =>
  09          {
  10               return Response.AsJson(_pessoas);
  11           };
  12
  13           Post["/"] = _ =>
  14          {
  15               var pessoa = this.Bind<Pessoa>();
  16               _pessoas.Add(pessoa);
  17               return HttpStatusCode.OK;
  18           };
  19        }
  20   }
Listagem 2. Classe IndexModule

Linha 03: Criamos uma lista estática de pessoas;

Linha 05: Aqui inicia o construtor do nosso módulo, no qual colocaremos os métodos que tratarão as requisições HTTP referentes a cada verbo desse protocolo, como GET e POST;

Linhas 08 a 11: Método para requisições GET. Retornarão a lista de pessoas em formato JSON;

Linhas 13 a 18: Método para o verbo POST. Nesse método, obtemos um objeto do tipo Pessoa, enviado no corpo da requisição (linha 15), o adicionamos à lista de pessoas (linha 16) e retornamos um status HTTP 200 - OK (linha 17).

Para testar esse serviço, utilizaremos uma ferramenta do Google Chrome chamada Postman, capaz de enviar requisições HTTP e obter suas respostas. Para instalá-la no seu navegador, basta acessar a página oficial.

Logo após, execute o projeto pelo Visual Studio, abra o Postman e preencha seus campos de acordo com a Figura 2.


Figura 2. Configuração da requisição no Postman

No campo Enter Request URL, devemos informar o endereço no qual o serviço está sendo executado e selecionar o método POST. Em seguida, devemos adicionar os valores de Id e Nome na guia Body.

Para que seja possível analisar o recebimento desses dados no serviço, volte ao Visual Studio e adicione um break point no método Post. Feito isso, basta clicar no botão Send do Postman.

A Figura 3 mostra os dados chegando no método Post. Perceba que como informamos no Postman os campos equivalentes à estrutura da classe Pessoa, foi possível obter os valores da requisição utilizando o método Bind.


Figura 3. Dados recebidos no módulo do NancyFx

Agora, para testarmos o método Get, basta trocar no Postman o verbo POST por GET e enviar novamente a requisição. O retorno esperado pode ser visto na Figura 4.


Figura 4. Retorno do método GET

Graças à sua estrutura simples e sua eficiência na implementação das mais variadas funcionalidades inerentes a serviços REST, o NancyFx vem ganhando espaço e se mostrando uma ótima opção para a construção desse tipo de aplicação. A partir dos exemplos que vimos nesse artigo, podemos implementar métodos mais complexos, utilizando outros verbos do protocolo HTTP e adicionar, por exemplo, os mecanismos adequados para realizar a persistência das informações em um banco de dados.


O que achou do NancyFx? Clique aqui e compartilhe experiências com a comunidade. =)