Primeiros passos com Web API usando o ASP.NET Core no Linux

Fala Galara,
Hoje vou mostrar como criar uma Web API muito básica com ASP.NET MVC 6 no Linux.
Esse tutorial é direcionado para quem está curioso sobre esse novo ambiente de desenvolvimento multiplataforma da Microsoft e quer dar seus primeiros passo com ASP.NET Core.

Para esse tutorial estou assumindo que o seu ambiente de desenvolvimento está todo instalado e configurado. Caso ainda não esteja, siga o link https://get.asp.net

Como meu ambiente de trabalho é linux, esse tutorial será baseado na CoreCLR runtime.
É possível verificar quais runtimes estão instaladas através do comando:

dnvm list

11

DNVM – .NET Version Manager
DNVM é uma ferramenta de gerenciamento de versão para a linha de comando. O DNVM permite configurar versão do .NET runtime, especificar qual versão do ambiente de execução será usada e até mesmo baixar outras versões.

Mas o que é uma Web API ?

O ASP.NET Web API é um framework que facilita a construção de serviços HTTP que podem ser consumidos por uma ampla gama de clientes, incluindo dispositivos móveis e navegadores.
Para isso, o ASP.NET Core 1.0 (Conhecido, também, como ASP.NET 5) possui, naturalmente, tudo o que nós precisamos.

Para exemplificar, iremos criar a Music API que expõe operações de CRUD simples.

Abra o terminal no diretório desejado e execute:

yo aspnet

Nesse momento o Yeoman irá fazer o download dos templetes do aspnet.
Após o download você estará apto a escolher o template “Web API Application”.

Untitled

Digite o nome da aplicação.

2

Pronto! Aplicação criada. Você deverá receber algumas instruções como retorno.

3

Por hora, faça somente os passos a seguir:

cd MusicAPI
dnu restore

 

DNU – .NET Development Utilities
DNU é uma ferramenta de linha de comando que fornece uma variedade de utilitários para auxiliar o desenvolvimento em ASP.NET. Mais comumente, vamos usar DNU para instalar e gerenciar pacotes de bibliotecas em nossa aplicação, e / ou para empacotar e publicar o nosso próprio aplicativo.

 

Feito isso, toda a estrutura inicial da aplicação estará criada.
É importante salientar que as aplicações ASP.NET Core são totalmente folder based, sendo assim, você poderá utilizar o editor de texto de sua preferência para trabalhar.
Eu utilizo e recomendo VSCode ou o Sublime Text 3.

12

A primeira coisa que devemos fazer é remover o “dnx451” do no nosso project.json. Esse é um problema já bem conhecido do generator-aspnet (Caso não exista a sessão “dnx451”, significa que já foi resolvido).

"frameworks": {
   "dnx451": { },   /* Remove this line  */
   "dnxcore50": { }
},

 

project.json
O arquivo project.json é novo para ASP.NET Core. Ele é usado para definir as dependências do lado do servidor do projeto, bem como outras informações específicas do projeto.

 

Criando Music model
Crie uma pasta chamada “Models” na raiz da aplicação e dentro dela crie um arquivo chamado “Music.cs”

using System;

namespace MusicAPI.Models
{
   public class Music
   {
      public Guid Id { get; set; }
      public string Name { get; set; }
      public string AlbumName { get; set;}
      public string BandName { get; set; }
      public DateTime ReleaseDate { get; set; }
   }
}

Perceba que a propriedade Id de nossa entidade Music é um Guid. Isso garantirá que só teremos uma entidade com esse identificador em toda a nossa aplicação.

Criando o repositório de Music model

O uso de classes de repositório é totalmente opcional, mas feremos dessa forma para que possamos conectar a qualquer banco de dados mais tarde.

Crie uma pasta chamada “Repositories” na raiz da applicação e adicione dois arquivos “IMusicRepository.cs” e “MusicRepository.cs”.
Aqui está o código de cada um dos arquivos:

IMusicRepository.cs

using MusicAPI.Models;
using System.Collections.Generic;

namespace MusicAPI.Repository
{
   public interface IMusicRepository
   {
      void Add(Music item);
      IEnumerable GetAll();
      Music Find(string key);
      void Remove(string Id);
      void Update(Music item);
   }
}

MusicRepository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using MusicAPI.Models;

namespace MusicAPI.Repository
{
   public class MusicRepository : IMusicRepository
   {
      static List MusicList = new List();

      public void Add(Music item)
      {
          MusicList.Add(item);
      }

      public Music Find(Guid Id)
      {
          return MusicList.Find(m => m.Id.Equals(Id));
      }

      public IEnumerable GetAll()
      {
          return MusicList;
      }

     public void Remove(Guid Id)
     {
         var itemToRemove = MusicList.SingleOrDefault(r => r.Id == Id);
         if (itemToRemove != null)
         MusicList.Remove(itemToRemove);
     }

     public void Update(Music item)
     {
	  var itemToUpdate = MusicList.SingleOrDefault(r => r.Id == item.Id);
	  if (itemToUpdate != null)
	  {
		itemToUpdate.Name = item.Name;
		itemToUpdate.AlbumName = item.AlbumName;
		itemToUpdate.BandName = item.BandName;
		itemToUpdate.ReleaseDate = item.ReleaseDate;
	  }
    }
  }
}

Adicionando a MusicController

É hora de adicionar a Controladora de nossa API. Dentro da pasta “Controllers” crie o arquivo ” “MusicController.cs”; Copie o código a seguir:

using MusicAPI.Models;
using MusicAPI.Repository;
using Microsoft.AspNet.Mvc;
using System.Collections.Generic;
using System;

namespace MusicAPI.Controllers
{
    [Route("api/[controller]")]
    public class MusicController : Controller
    {
        [FromServices]
        public IMusicRepository MusicRepo { get; set; }

        [HttpGet]
        public IEnumerable<Music>GetAll()
        {            
            return MusicRepo.GetAll();
        }

        [HttpGet("{id}", Name = "GetMusic")]
        public IActionResult GetById(Guid id)
        {
            var item = MusicRepo.Find(id);
            if (item == null)
            {
                return HttpNotFound();
            }
            return new ObjectResult(item);
        }

        [HttpPost]
        public IActionResult Create([FromBody] Music item)
        {
            if (item == null)
            {
                return HttpBadRequest();
            }
            MusicRepo.Add(item);
            return CreatedAtRoute("GetMusic", new { Controller = "Music", id = item.Id }, item);
        }

        [HttpPut("{id}")]
        public IActionResult Update(Guid id, [FromBody] Music item)
        {
            if (item == null)
            {
                return HttpBadRequest();
            }
            var contactObj = MusicRepo.Find(id);
            if (contactObj == null)
            {
                return HttpNotFound();
            }
            MusicRepo.Update(item);
            return new NoContentResult();
        }

        [HttpDelete("{id}")]
        public void Delete(Guid id)
        {
            MusicRepo.Remove(id);
        }
    }
}

Alguns detalhes sobre nossa Controller:

[Route(“api/[controller]”)] Esse é o novo “attribute based routing” do MVC 6 Web API.
[FromServices] Indica que a propriedade MusicRepo é obrigada a requisitar no objeto Services. Em outras palavras, MusicRepo é instanciado usando injeção de dependência que nos configuramos no Starup.cs.
GetAll() É um simples método HttpGet que retorna todas as músicas
GetById Retorna uma Música através do Id. É um simples HttpGet com um atributo nomeado para que possamos usá-lo também no método Create como “location header”.
O método Create, depois de inserir o registro, retorna o codigo 201 como status response e fornece o location header.

Configurando a Injeção de Dependências

O método “ConfigureServices” do arquivo “Startup.cs” é o local onde ensinaremos ao container de IoC como resolver a instanciação de objetos do tipo IMusicRepository

        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc();
            
            //using Dependency Injection
            services.AddSingleton<IMusicRepository, MusicRepository>();
        }

Testando Web API usando o POSTMAN

Vá para o terminal e certifique-se de que está no diretório raiz da aplicação.
Execute o comando

dnx web


DNX – .NET Execution Environment
DNX é um kit de desenvolvimento de software (SDK) e ambiente de execução que tem tudo que você precisa para criar e executar aplicativos .NET para Windows, Mac e Linux. Ele fornece um processo de host, lógica de hospedagem CLR e muito mais. O DNX foi construído para executar aplicativos ASP.NET Web em multi-plataformas, mas pode executar outros tipos de aplicativos .NET, também, como aplicações de console cross-platform.


Como dito antes, testaremos nossa aplicação através do POSTMAN, que é muito simples de se usar.
(Para gerar um Guid você pode usar qualquer gerador de Guid que encontrar pela web)

– POST
7

– GET
8

– PUT
9

– DELETE
10

Galera, por hoje é isso!
Em breve darei sequência a esse tutorial onde iremos configurar o EF7 e Aprender mais sobre Injeção de Dependências.
Até lá.

Github: https://github.com/elvisdelima/MusicAPI

Standard

Continuous Integration com Teamcity no Docker

Essa semana precisei configurar um servidor de Continuous Integration (CI) com o Teamcity para um novo projeto em que estou trabalhando. Resolvi fazer essa configuração usando Docker por conta dessa série de benefícios que aqui estão:

  • Poderemos mover as configurações de CI para outro servidor de forma tranquila.
  • Se um dia for preciso mover esse servidor para algum serviço de núvem(como AWS ou Azure), será fácil.
  • Teremos um backup de todas as configurações de ambiente em uma imagem.
  • Teremos a possibilidade de voltar para o estado anterior da imagem, caso alguma configuração de ambiente quebre o servidor.
  • Será possível criar uma cópia exata do container docker em uma máquina local, para fins de configuração ou de debbug.
  • Poderemos reaproveitar essas configurações para outros projetos.

Bom, dito isso, agora vou mostrar para vocês como fazer essa configuração do Teamcity no Docker. Vamos colocar a mão na massa!

Em primeiro lugar vamos fazer a instalação do Docker. Eu optei por usar o Ubuntu Server Willy 15.10 mas você pode usar outras versões, destribuições ou até outros sistemas operacionais, se desejar. Esse tutorial será direcionado para o S.O. que estou utilizando.

Importante!

Para executar os comandos a seguir no linux você precisará de permissão. Basta fazer login como root ou acrescentar SUDO antes de cada comando.

Para fazer a instalação do Docker siga os passos que estão no link a seguir:
https://docs.docker.com/engine/installation/ubuntulinux/

Feito isso, agora iremos iniciar dois containers Docker, um para o Teamcity e outro para o banco de dados postgres (Essa estrutura não é obrigatória mas para ambiente de produção é fortemente aconcelhada).

Container do postgres

Para levantar o container do postgres e configurar o banco de dados, faça:


# Guarde a senha do banco em uma variável

$ POSTGRES_PASSWORD=yourpassword

# Guarde o script de criação do banco em uma variável

$ SETUP_TEAMCITY_SQL="create role teamcity with login password 'teamcity';create database teamcity owner teamcity;"

# Inicie uma instancia do docker com o postgres

$ docker run --name some-postgres -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD -d postgres

# Crie o banco usando plsql

$ docker run -it --link some-postgres:postgres --rm -e "SETUP_TEAMCITY_SQL=$SETUP_TEAMCITY_SQL" -e "PGPASSWORD=$POSTGRES_PASSWORD" postgres bash -c 'exec echo $SETUP_TEAMCITY_SQL |psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

 

$ docker run

Pelo que o nome já diz, o comando Run roda um container docker. Mas o que faz cada um desses parâmetros? (–name, -e, -d, –rm, -h, -p, …)

Para nossa alegria a documentação do docker é bem rica. Você poderá aprender mais sobre todos os parâmetros desse comando no link: https://docs.docker.com/engine/reference/run/

Container do teamcity

Iremos utilizar como base uma imagem do teamcity que está armazenada em dockerhub.com.

O comando a seguir irá expor a porta 8111(porta padrão do Teamcity) do container para a máquina host, também pela porta 8111.

docker run --link some-postgres:postgres -v <teamcitydir>:/var/lib/teamcity -p 8111:8111 -d sjoerdmulder/teamcity:latest 

Após isso você já poderá acessar http://localhost:8111 que a tela inical de configuração do teamcity já deverá estar disponível.

teamcity

O próximo passo é a configuração do banco de dados do teamcity.

teamcity-postgres

Pronto, agora já poderemos partir para as configurações de build, mas não agora, isso vai ficar para um próximo post. Em breve faremos a configuração de nosso teamcity também utilizando Docker para cada um de nossos build agents. Na prática, usaremos Docker dentro do Docker. 😉

Te vejo em breve!
Grande abraço!

Standard

Hello World!

Fala Galera, aqui é o Elvis.

Tudo bem com vocês?

Estou criando esse blog com o intuito de compartilhar com vocês alguns de meus estudos e conhecimentos. O conteúdo que será produzido terá um direcionamento maior para as áreas em que atuo, como desenvolvimento web usando tecnologias microsoft, arquitetura de software e cloud computing. Também serão pauta desse espaço, dicas para quem está iniciando a carreira e assuntos gerais sobre tecnologia. Então fica de olho que em breve teremos muitas novidades.

Grande abraço!

Standard