segunda-feira, 13 de abril de 2015

Introdução ao Web API no ASP.NET 5 (vNext) MVC 6

Neste artigo irei explorar o Web API, seguindo dicas de diversos artigos citados nas referências
Inicie o Visual Studio 2015
Neste post estou utilizando a versão:
Microsoft Visual Studio Ultimate 2015 Preview
Version 14.0.22310.1 DP
Microsoft .NET Framework
Version 4.5.53349
Caso não tem o Visual Studio 2015, baixe aqui.

Inicie um novo projeto “ASP.NET 5 Starter Web” conforme prints abaixo:



Entendendo o projeto ASP.NET 5 Starter Web

O projeto inclui os seguintes arquivos de configuração já devidamente:
  • global.json : contém configurações da solução e permite referências entre projetos
  • project.json : contém configurações do projeto
  • packages.json: contém configurações para os pacotes NPM
  • Startup.cs : contém código de inicialização e configurações que detalharei abaixo

Project.json

O Project.json tem as seguintes definições [2]:
  • Dependencies (Dependências): que são definidos por nome e versão e no Visual Studio tem ajuda do intellisense conforme prints abaixo
  •  

     
  • Configurations (Configurações): são grupos de configurações para compilações do projeto. Há 2 por padrão (Debug, Release), mas outros podem ser criados
  • Frameworks: definições de versão da framework a ser utilizada
  • Sources (Fontes): Define quais arquivos devem ser incluídos e compilados
o Há várias chaves para esta seção, como exclude, packExclude
  • WebRoot (Raiz web): Define qual o diretório raiz da aplicação que é público na web
  • Commands: comandos que podem ser executados através da linha de comando (No caso do Windows o cmd.exe) e que precisam de prévia instalação do KVM (K Version Manager) [3]

Startup

A classe Startup definida no arquivo startup.cs contém a definição de pipeline de requisição do ASP.NET. Ela substitui o Global.asa e Global.asax existentes em versões anteriores, conforme Shawn Wildermuth [4].
No construtor Startup são carregadas as informações de configurações do config.json e de ambiente. O config.json também substitui o antigo web.config.
Há dois outros métodos:
  • ConfigureServices: configura as injeções de dependências
  • Configure: configura a aplicação, inclusive entre os diferentes ambientes

Entendendo a configuração do Web Api

Para usar o Web API é necessário adicionar a dependência do AspNet.MVC 6. Neste exemplo há disponível a versão "6.0.0-beta1".


Depois no Startup.cs é necessário adicionar o seguinte using:

 using Microsoft.Framework.DependencyInjection;  

Depois configure o MVC conforme abaixo:

 public void ConfigureServices(IServiceCollection services)  
 {  
   // Add MVC services to the services container.  
   services.AddMvc();  

E configure o uso do MVC conforme abaixo:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)  
 {  
   app.UseMvc(routes =>  
   {  
     routes.MapRoute(  
       name: "default",  
       template: "{controller}/{action}/{id?}",  
       defaults: new { controller = "Home", action = "Index" });  
   });  

Adicionando o Web Api

Iremos criar um Web Api expondo uma lista de tarefa. Para isso, precisamos criar a classe modelo TodoItem
https://github.com/mqueirozcorreia/MVC6WebApi01Sample/blob/master/src/MVC6WebApi01/Models/TodoItem.cs
Depois vamos criar a interface ITodoRepository do repositório de Todo.
https://github.com/mqueirozcorreia/MVC6WebApi01Sample/blob/master/src/MVC6WebApi01/Models/ITodoRepository.cs
Depois vamos implementar o repositório.
https://github.com/mqueirozcorreia/MVC6WebApi01Sample/blob/master/src/MVC6WebApi01/Models/TodoRepository.cs
Finalmente, vamos implementar o TodosController
https://github.com/mqueirozcorreia/MVC6WebApi01Sample/blob/master/src/MVC6WebApi01/Controllers/TodosController.cs 
 
Repare que o Controller criado utiliza a injeção de dependência pelo construtor, conforme abaixo:

 private readonly ITodoRepository _repository;  
 public TodosController(ITodoRepository repository)  
 {  
   _repository = repository;  
 }  

Para que essa injeção de dependência funcione, precisamos antes configura-la no Startup.ConfigureServices, conforme abaixo:

   // Injeções de dependência da aplicação  
   services.AddSingleton<ITodoRepository, TodoRepository>();  
 }  

Visualizando o Web Api

Feitas todas as configurações e codificações, execute a aplicação


Um navegador será aberto e adicione ao fim da Url o caminho do serviço do TodosController:
http://localhost:59304/api/todos
A porta (59304), pode variar conforme configurações do seu projeto.
A requisição da url acima vai acionar o método TodosController. GetAll e mostrar o resultado abaixo em formato XML:


Há vários plug-ins para ajudar a testar serviços Rest como o Rest Easy do Firefox e o Postman do Chrome. Com ele é possível configurar por exemplo o cabeçalho “Accept” para informar que aceita “application/json” e ver que o Web Api faz o retorno adaptado para JSON, se fazer nenhuma alteração no código da aplicação:


Veja o fonte final:

https://github.com/mqueirozcorreia/MVC6WebApi01Sample

Referências

1. http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6
2. https://github.com/aspnet/Home/wiki/Project.json-file
3. http://www.asp.net/vnext/overview/aspnet-vnext/vc#cnp
4. http://wildermuth.com/2015/03/02/A_Look_at_ASP_NET_5_Part_2_-_Startup