Criando aplicação web com Nancy

Olá pessoal, hoje eu vou falar um pouco sobre Nancy.

O que é?

É um framework leve e simples para construção serviços HTTP usando tecnologia .Net e Mono, e fornece uma Domain Specific Language (DSL) para devolver uma resposta de forma simples.
Foi projetada para rodar em qualquer lugar, já que ela possui seus próprios objetos de solicitação e resposta.
Um dos conceitos fundamentais em Nancy são os hosts. Um host atua como um adaptador para um ambiente de hospedagem, permitindo assim que ela possa ser executada com as tecnologias existentes, como ASP.NET, WCF e Owin, ou integrado em qualquer aplicação.
Nancy é um projeto open source, hospedado no GitHub e está licenciado sob a MIT license.

Como instalar?

Você pode instalar via NuGet, segue a lista dos pacotes oficiais da Nancy.
Se você vai usar sobre ASP.NET por exemplo, você pode executar o comando abaixo no Package Manager Console do Visual Studio.

1
Install-Package Nancy.Hosting.Aspnet

Qual problema resolve?

  • Não precisa de muitas configurações, ela já vem com algumas definidas.
  • Para adicionar um novo módulo, geralmente é só implementar uma interface e ela já injeta para você via reflection.
  • Existem muitos módulos separados já criados, por exemplo, para trocar o IoC padrão é só instalar o novo e configurar no Boostrapper.

Com Nancy você precisa se preocupar mais em criar seu aplicativo do que ficar criando código de configuração.

Alguns exemplos

Agora vamos criar nosso primeiro exemplo.
No Visual Studio na tela de New Project, escolha a versão .NET Framework 4.5, depois crie um projeto ASP.NET Empty Web Application.
No Package Manager Console, rode o comando Install-Package Nancy.Hosting.Aspnet.
Agora crie uma classe com o código abaixo.

HomeModule.cs
1
2
3
4
5
6
7
public class HomeModule : NancyModule
{
public HomeModule()
{
Get["/"] = _ => "I'm working...";
}
}

Agora se você rodar a aplicação irá imprimir no navegador.

1
I'm working...

Para receber uma informação passada na Query String é bem simples segue um exemplo abaixo.

AccountsModule.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class AccountsModule : NancyModule
{
public AccountsModule()
: base("accounts")
{
Get["/{id}"] = parameters => GetById(parameters.id);
}

private Response GetById(int id)
{
var response = new
{
id,
name = "Júnior"
};

return Response.AsJson(response);
}
}

Se você for ao navegador e digitar /accounts/25 ele irá imprimir o json abaixo.

1
2
3
4
{
id: 25,
name: "Júnior"
}

Recebendo os dados de uma requisição POST.
Note no código que eu usei o código this.Bind() para fazer o de para dos dados enviados para a minha classe AccountModel.
Depois eu apenas gerei um Id randômico e respondi o id fake gerado.

AccountsModule.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class AccountsModule : NancyModule
{
public AccountsModule()
: base("accounts")
{
Get["/{id}"] = parameters => GetById(parameters.id);
Post["/"] = _ => Create(this.Bind<AccountModel>());
}

private Response GetById(int id)
{
var response = new
{
id,
name = "Júnior"
};

return Response.AsJson(response);
}

private Response Create(AccountModel model)
{
model.Id = new Random().Next(1, 100);

var response = new
{
id = model.Id
};

return Response.AsJson(response, HttpStatusCode.Created);
}
}

public class AccountModel
{
public int Id { get; set; }
}

Devolvendo uma página HTML.
Para devolver uma página HTML, você precisa criar na raiz do projeto uma pasta chamada Views, e dentro dela, uma pasta com o nome igual a da sua rota.
No caso eu vou criar um módulo chamado DocModule e uma rota para doc, logo dentro da pasta Views eu vou criar uma pasta Doc e colocar o meu arquivo HTML lá dentro.
Abaixo o código para devolver o arquivo HTML para o navegador, note que o nome do arquivo que eu estou devolvendo é index.html, sendo assim, o nome do arquivo que eu vou criar precisa ser index.html também.

DocModules.cs
1
2
3
4
5
6
7
8
public class DocModules : NancyModule
{
public DocModules()
: base("doc")
{
Get["/"] = _ => View["index.html"];
}
}

Obrigado pela visita e até a próxima.