 ASP .NET 
Core -  Criando uma Web API - I
ASP .NET 
Core -  Criando uma Web API - I
|  | Neste artigo vamos iniciar a criação de uma WEB API usando a ASP .NET Core 3.0 para a seguir mostrar como consumir a API em uma aplicação ASP .NET Core MVC. | 
As WEB APIs ASP .NET Core são controladores que herdam da classe ControllerBase e que produzem como respostas objetos de dados que são enviados ao cliente sem a marcação HTML.
|  | 
Vamos iniciar criando um projeto ASP .NET Core WEB APi usando o .NET Core 3.0 simples que expõe serviços para reserva de veículos.
Para não tornar o exemplo muito complexo não vou usar um banco de dados gerando os dados em memória.
Recursos :
Criando o projeto no VS 2019 Community
Abra o VS 2019 Community e crie uma solução em branco via menu File-> New Project;

Selecione o template ASP .NET Core Web Application, e, Informe o nome ApiReservas;
A seguir selecione .NET Core e ASP .NET Core 3.0 e marque o template API e as configurações conforme figura abaixo:

Clicando em Create teremos o projeto ASP .NET Core Web API criado e vamos aproveitar essa estrutura e arquivos criados para criar a nossa API de reservas.
Abaixo temos a estrutura do projeto criado:

Vamos remover os arquivos marcados pois não vamos usá-los no projeto.
Definindo o modelo de domínio e o Repositório
Vamos criar uma pasta Models no projeto e a seguir criar nesta patsa a classe Reserva que representa o nosso modelo de domínio:
| public class Reserva { public int ReservaId { get; set; } public string Nome { get; set; } public string InicioLocacao { get; set; } public string FimLocacao { get; set; } } | 
Na mesma pasta Models vamos criar uma interface IRepository e sua implementação e implementar o padrão Repositório para desacoplar a camada de acesso a dados e centralizar a lógica de acesso a dados.
| public interface IRepository { IEnumerable<Reserva> Reservas { get; } Reserva this[int id] { get; } Reserva AddReserva(Reserva reserva); Reserva UpdateReserva(Reserva reserva); void DeleteReserva(int id); } | 
A seguir vamos criar a classe Repository que implementa esta interface:
| using System.Collections.Generic; 
		namespace ApiReservas.Models                        public Repository() public Reserva this[int id] => items.ContainsKey(id) ? items[id] : null; public IEnumerable<Reserva> Reservas => items.Values;                 public Reserva AddReserva(Reserva reserva)                 public void DeleteReserva(int id)                 public Reserva UpdateReserva(Reserva reserva) | 
Neste código implementamos os métodos da interface usando um Dictionary. Assim não dependendemos de um banco de dados relacional. Poderíamos também usar o Entity Framework In-Memory conforme eu mostro neste artigo: EF Core - Usando um Banco de dados In-Memory ... - Macoratti
A classe
Repository cria 3 conjuntos de objetos de reserva 
quando é instanciada e, como não há armazenamento persistente, quaisquer 
alterações serão perdidas quando o aplicativo for parado ou reiniciado.
A classe contém métodos para executar operações CRUD e todas as reservas são 
armazenadas em um objeto do tipo Dicionário.
Configurando o arquivo Startup
A seguir vamos definir a configuração no arquivo Startup para mapear o serviço para repositório usando AddSingleton.
Na ASP .NET Core 3.0 houve para definir a configuração da Web API basta incluir o serviço AddControllers().
| using ApiReservas.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; 
		namespace ApiReservas public IConfiguration Configuration { get; }                 public void ConfigureServices(IServiceCollection services)                 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)                               app.UseHttpsRedirection(); | 
Para definir o roteamento usamos app.UseRouting() e para definir os endpoints da API usamos app.UseEndPoints().
Criando o controlador ReservasController
Agora vem a 
parte mais importante da criação de um controlador de API. Lembre-se de que a 
API Controller é apenas um controlador normal que permite que os dados no modelo 
sejam recuperados ou modificados e entregue a algum cliente, sem precisar usar 
as ações fornecidas pelos controladores regulares.
A entrega dos dados é feita seguindo o padrão REST que 
significa Representational State Transfer, e contém 
2 pontos principais:
1. Métodos Actions para executar operações 
específicas e, em seguida, entregar alguns dados ao cliente. Esses métodos são 
decorados com atributos que permitem que sejam invocados por requisições HTTP.
2. A URL à qual uma operação será aplicada. As 
operações podem ser - envio total ou parcial de dados, 
adição, exclusão ou atualização de registros.
Vamos então criar na pasta Controllers o controlador 
ReservasController clicando com o botão direito do mouse sobre a pasta
Controllers e a seguir em Add 
-> Controller;
A seguir selecione o template - API Controller - Empty e clique em Add;

Informe o nome ReservasController e clique em Add.
Serão instalados os pacotes necessários e o controlador será criado.
A seguir inclua o código abaixo no arquivo ReservasController.cs :
| using ApiReservas.Models; using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; 
		namespace ApiReservas.Controllers                [HttpGet]                       [HttpGet("{id}")]                       [HttpPost]                       [HttpPut]                    [HttpPatch("{id}")]                     [HttpDelete("{id}")] | 
Temos que incluir no projeto uma referência ao pacote: Microsoft.AspNetCore.JsonPatch.
Agora, antes de prosseguir, vamos alterar a configuração do projeto acessando as suas propriedades e na guia Debug definindo os valores abaixo:

Pronto ! vamos agora analisar o código do controlador.
Faremos isso na próxima parte do artigo.
Pegue o código 
do projeto (sem as referências) : 
 ApiReservas.zip
 
ApiReservas.zip
"Tendo 
sido, pois, justificados pela fé, temos paz com Deus, por nosso Senhor Jesus 
Cristo;
Pelo qual também temos entrada pela fé a esta graça, na qual estamos firmes, e 
nos gloriamos na esperança da glória de Deus."
Romanos 5:1,2
Referências:
ASP .NET Core - Implementando a segurança com ...
ASP.NET Core MVC - Criando um Dashboard ...
ASP .NET Core - Apresentando Razor Pages -
ASP .NET Core MVC - CRUD básico com ADO .NET
ASP .NET Core - Implementando e consumindo JWT
ASP .NET Core - Criando uma API CRUD - I
ASP .NET Core - Criando sua primeira Web API