Logo abaixo será explicado e exemplificado como criar uma WebAPI consumindo dados do Postgres e uma aplicação que irá consumir esse WebAPI.
O acesso aos dados não será utilizando Entity Framework, mas sim “SQL Puro”. Mas por que não Entity Framework? A explicação é simples: existem vários artigos mostrando como utilizar Postgres com Entity, logo, quis dar uma segunda opção, que inclusive “eu prefiro”.
Observação: não estou dizendo que uma é melhor que a outra, apenas que eu prefiro ter “controle” sobre as minhas consultas. Entretanto, no meu dia a dia (no meu trabalho) eu utilizo NHIbernate, que ao meu ver está mais para o Entity do que para o ADO.NET.
Criando as tabelas no Postgres
Este artigo não tem como objetivo ensinar a configurar o Postgres no GNU/Linux. Para isso existem vários artigos disponíveis na internet. Para o nosso exemplo foi criado o Database “DotNetCoreAPI” e a tabela “Pessoa”, conforme ilustra a figura 1 a seguir:

Os scripts para criação do database, criação da tabela e inserção de alguns dados estão logo abaixo:
-- Database: "DotNetCoreAPI" -- DROP DATABASE "DotNetCoreAPI"; CREATE DATABASE "DotNetCoreAPI" WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' CONNECTION LIMIT = -1; -- Table: public."Pessoa" -- DROP TABLE public."Pessoa"; CREATE TABLE public."Pessoa" ( id bigint NOT NULL, cpf bigint NOT NULL, nome character(255) NOT NULL, CONSTRAINT pk_id PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE public."Pessoa" OWNER TO postgres; insert into "Pessoa" values (1,123456789, 'DotNet_1'); insert into "Pessoa" values (2,123456788, 'DotNet_2'); insert into "Pessoa" values (3,123456787, 'DotNet_3');
Criando o Projeto WebAPI
Antes de criar nosso projeto, o .NET Core utilizado está na versão “2.1.4”. Para realizar essa instalação/atualização eu segui o passo a passo da própria Microsoft “https://docs.microsoft.com/pt-br/dotnet/core/linux-prerequisites?tabs=netcore2x”. Utilizaremos o comando .NET New para criação do projeto e o template “webapi”. Digite o comando abaixo no terminal GNU/Linux:
“dotnet new webapi -n PessoaAPI” → webapi o tipo do projeto que desejamos criar; -n PessoaAPI é o nome do Projeto. Para verificar outros parâmetros digite “dotnet new –help”.
O comando acima criará o diretório PessoaAPI e o Projeto PessoaAPI.csproj, como ilustra a figura 2, abaixo:

Agora que o nosso projeto está criado, abriremos o VS Code e direcionaremos a pasta padrão para ele. Após escolher a pasta padrão, seu VSCode deverá ter os seguintes arquivos, conforme a figura a seguir:

Como utilizamos um template para criação do projeto, ele vem com uma classe ValuesController. Ao abrir é possível verificar que temos um exemplo prontinho:

Comandos
dotnet restore;
dotnet build;
dotnet run;

Veja na figura 5 que o retorno do comando, dotnet run foi que a aplicação está executando no endereço localhost porta 5000. Então para testarmos a WebAPI exemplo, digite o seguinte endereço em seu browser “localhost:5000/api/values/get”. Se tudo estiver funcionando, será exibido algo como na figura 6.

Agora que validamos nosso ambiente, é hora de iniciarmos o nosso projeto.
Criando WebAPI PessoaAPI
Como dito anteriormente, será utilizado ADO.NET para acessar o Postgres. Para isso, instalaremos seu provider através do nuget. Execute os comandos abaixo:
dotnet add PessoaAPI.csproj package Npgsql
Em nosso exemplo utilizaremos o modelo (BLL, DAL, Model), apesar de ser uma arquitetura considerada “ultrapassada”, é simples e eficaz para o nosso projeto.
Utilizando o VSCode vamos criar três pastas e três classes, sendo elas BLL (BPessoa.cs), DAL(DPessoa.cs) e Model (Pessoa.cs). A estrutura ficará parecida com a figura 7.

A classe DPessoa recuperará os dados do Postgres e alimentará uma lista de objetos do tipo Pessoa. A classe BPessoa consumirá a lista gerada pela classe DPessoa.
Abaixo, os códigos das classes criadas.
Model/Pessoa.cs
using System; namespace PessoaAPI.Models { public class Pessoa{ public Int64 Id {get;set;} public Int64 CPF {get;set;} public string Nome {get;set;} } }
DAL/DPessoa.cs
using Npgsql; usng System.Collections.Generic; using System; using PessoaAPI.Models; namespace PessoaAPI.DAL { public class DAOPessoa{ public List<Pessoa> RetornarPessoas(){ var connString = "Host=localhost;Username=postgres;Password=zp3;Database=DotNetCoreAPI"; List<Pessoa> lstPessoa = new List<Pessoa>(); try{ using (var conn = new NpgsqlConnection(connString)) { conn.Open(); using (var cmd = new NpgsqlCommand("SELECT id, cpf, Nome FROM \"Pessoa\"", conn)) using (var reader = cmd.ExecuteReader()) while (reader.Read()){ Pessoa pessoa = new Pessoa(); pessoa.Id = (Int64)reader["id"]; pessoa.CPF = (Int64)reader["cpf"]; pessoa.Nome = reader.GetString(2); lstPessoa.Add(pessoa); } conn.Close(); } }catch(Exception ex){ string teste = ex.Message; } return lstPessoa; } } }
BLL/BPessoa.cs
using System.Collections.Generic; using PessoaAPI.Models; using PessoaAPI.DAL; namespace PessoaAPI.BLL { public class BPessoa { public List<Pessoa> RetornarPessoas(){ return new DAOPessoa().RetornarPessoas(); } } }
A estrutura está criada. Agora criaremos a controller da nossa API. Dentro da pasta controller crie um arquivo chamado ApiPessoaController.cs. Adicionaremos o código abaixo no controller:
ApiPessoaController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using PessoaAPI.BLL; using PessoaAPI.Models; namespace PessoaAPI.Controllers { [Route("api/[controller]")] public class ApiPessoaController : Controller { // GET api/values [HttpGet("{id}")] public List<PessoaAPI.Models.Pessoa> Get(){ return new BPessoa().RetornarPessoas(); } } }
O código acima “simplesmente” acessa a classe de negócio e expõe ela. Foi criada uma “rota” onde, para acessarmos a API, será necessário colocar o “http://endereco/api/ApiPessoaController”
Após a implementação acima, testaremos nossa API para verificar se tudo está funcionando como planejamos. Para isso, execute os comandos abaixo:
dotnet restore;
dotnet build;
dotnet run;
Depois, acesse http://localhost:5000/api/ApiPessoa/Get/ e o resultado esperado é parecido com a figura 8:

Temos nossa API pronta. Criaremos em seguida nosso cliente para consumo de nossa API.
Cliente WEB
Vamos criar duas pastas dentro da Pasta Views, chamadas “Home” e “Shared”. Criaremos também três arquivos Index.cshtml (dentro de Views → Home), _Layout.cshtml (dentro de Views → Shared) e HomeController.cs (dentro de Controllers). Nossa aplicação ficará com a estrutura da figura 9:

Logo abaixo estará o código dos três novos arquivos criados. Dos três, o arquivo “mais importante” é o index.cshtml, que utilizará jquery para consumir nossa API.
HomeController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; namespace PessoaAPI.Controllers { public class HomeController : Controller{ public IActionResult Index(){ return View(); } } }
_Layout.cshtml
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Testando - ASP.NET MVC Core </title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li><a href="/">Home</a></li> </ul> </div> </div> </div> <div class="container body-content"> @RenderBody() <footer> <p>© @DateTime.Now.Year - Minha primeira aplicação dotnet core</p> </footer> </div> </body> </html>
Index.cshtml
@{ Layout = "/Views/Shared/_Layout.cshtml"; ViewBag.Tittle = "Home Page"; } <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> <div class="jumbotron"> <p><a href="#" id="get-data" class="btn btn-primary btn-large">Recuperar informações Json</a></p> <table id="minhaTbl"> <thead> <tr> <th>CPF</th> <th>Nome</th> </tr> </thead> <tbody> </tbody> </table> </div> <script> $(document).ready( function(){ $('#get-data').click(function(){ var showData = $('#show-data'); $.getJSON('/api/apipessoa/get', function (data){ console.log(data); var tblRef = document.getElementById('minhaTbl').getElementsByTagName('tbody')[0]; var newRow = tblRef.insertRow(tblRef.rows.length); var itens = ''; for (var i=0; i< data.length; i++){ var newRow =tblRef.insertRow(tblRef.rows.length); var newCell1 =newRow.insertCell(0); var newText1 =document.createTextNode(data[i].cpf); newCell1.appendChild(newText1); var newCell2 = newRow.insertCell(1); var newText2 = document.createTextNode(data[i].nome); newCell2.appendChild(newText2); } }); showData.text('Carregando arquivo Json'); }); }); </script>
Após os passos acima, novamente compilaremos e executaremos nossa aplicação.
dotnet restore;
dotnet build;
dotnet run;
Acesse o link http://localhost:5000/. Será exibido algo como na figura 10, abaixo.

Quando clicar em “Recuperar informações Json”, irá carregar na tela as informações do banco de dados Postgres, conforme ilustra a figura 11.

Como teste, insira novos dados no banco de dados e veja o resultado ao clicar em “Recuperar Informações Json”.
Conclusão
Confesso ainda achar “estranho” utilizar ferramentas e tecnologias Microsoft no GNU/Linux, porém, como desenvolvedor .NET e apaixonado por Linux, vai facilitar muito meus estudos.
As fontes podem ser baixadas em: https://github.com/ztiago3/DotNetCore/tree/master/WebAPI/PessoaAPI