Introdução
No cenário atual de desenvolvimento de software, muitas empresas ainda operam com sistemas legados construídos em ferramentas como o FoxPro. Embora esses sistemas sejam funcionais, a integração com tecnologias modernas é vital para garantir competitividade e eficiência. Este tutorial guiará você na criação de uma API REST usando .NET, que permitirá que suas aplicações legadas em FoxPro interajam com sistemas modernos. Vamos cobrir desde a configuração inicial do projeto em .NET até a implementação da lógica necessária para realizar chamadas à API, possibilitando o acesso e a manipulação de dados armazenados em sistemas legados. Com exemplos práticos e um ciclo completo de desenvolvimento, você terá as ferramentas necessárias para realizar essa integração de forma eficaz.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o .NET SDK instalado na sua máquina. Você pode verificar a instalação através do comando `dotnet –version` no terminal. Se não tiver o SDK, faça o download no site da Microsoft.
commands# Verificar se o .NET SDK está instalado
dotnet --versionCriação do Projeto .NET
Use o comando abaixo para criar um novo projeto de API Web no .NET. O comando criará um projeto baseado nos templates padrão com suporte para API REST.
commandsdotnet new webapi -n FoxProIntegration
Configuração do Banco de Dados
Adicione uma conexão ao banco de dados que será utilizado para a integração com o FoxPro. Neste exemplo, usaremos um banco SQLite, que deve ser instalado via NuGet.
commandsdotnet add package Microsoft.EntityFrameworkCore.Sqlite
Criação do Modelo de Dados
Crie uma classe que representará os dados do FoxPro que você deseja manipular na nova API. Essa classe será usada como modelo no Entity Framework.
Produto.csusing System.ComponentModel.DataAnnotations; namespace FoxProIntegration.Models { public class Produto { [Key] public int Id { get; set; } public string Nome { get; set; } public decimal Preco { get; set; } } }
Configuração do DbContext
Crie uma classe que herda de DbContext e configure o DbSet para o modelo. Essa classe será responsável pela comunicação com o banco de dados.
AppDbContext.csusing Microsoft.EntityFrameworkCore; namespace FoxProIntegration.Data { public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<Produto> Produtos { get; set; } } }
Criação do Serviço para Operações CRUD
Implemente uma classe de serviço que manipula as operações CRUD no banco de dados usando o contexto definido anteriormente.
ProdutoService.csusing System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; namespace FoxProIntegration.Services { public class ProdutoService { private readonly AppDbContext _context; public ProdutoService(AppDbContext context) { _context = context; } public List<Produto> GetAll() { return _context.Produtos.ToList(); } public Produto GetById(int id) { return _context.Produtos.Find(id); } public void Create(Produto produto) { _context.Produtos.Add(produto); _context.SaveChanges(); } public void Update(Produto produto) { _context.Entry(produto).State = EntityState.Modified; _context.SaveChanges(); } public void Delete(int id) { var produto = _context.Produtos.Find(id); _context.Produtos.Remove(produto); _context.SaveChanges(); } } }
Implementação do Controller da API
Crie um controlador que expõe as rotas para a API, permitindo acesso à funcionalidade CRUD através de requisições HTTP.
ProdutoController.csusing Microsoft.AspNetCore.Mvc; using FoxProIntegration.Models; using FoxProIntegration.Services; namespace FoxProIntegration.Controllers { [Route("api/[controller]")] [ApiController] public class ProdutoController : ControllerBase { private readonly ProdutoService _produtoService; public ProdutoController(ProdutoService produtoService) { _produtoService = produtoService; } [HttpGet] public ActionResult<List<Produto>> Get() { return _produtoService.GetAll(); } [HttpGet("{id}")] public ActionResult<Produto> Get(int id) { var produto = _produtoService.GetById(id); if (produto == null) return NotFound(); return produto; } [HttpPost] public ActionResult Create([FromBody] Produto produto) { _produtoService.Create(produto); return CreatedAtAction(nameof(Get), new { id = produto.Id }, produto); } [HttpPut("{id}")] public IActionResult Update(int id, [FromBody] Produto produto) { if (id != produto.Id) return BadRequest(); _produtoService.Update(produto); return NoContent(); } [HttpDelete("{id}")] public IActionResult Delete(int id) { _produtoService.Delete(id); return NoContent(); } } }
Implementação de Testes Unitários
Utilize xUnit para criar testes unitários para a API, garantindo que as operações de serviço estão funcionando como esperado.
ProdutoServiceTests.csusing System.Collections.Generic; using Xunit; using FoxProIntegration.Models; using FoxProIntegration.Services; namespace FoxProIntegration.Tests { public class ProdutoServiceTests { [Fact] public void TestGetAll() { var service = new ProdutoService(new TestDbContext()); // Você deve criar um contexto de teste var produtos = service.GetAll(); Assert.IsType<List<Produto>>(produtos); } // Adicione mais testes para métodos GetById, Create, Update, Delete } }
Executando a Aplicação e Testes
Utilize os comandos do .NET para compilar e executar a aplicação. Em seguida, teste os endpoints usando ferramentas como Postman ou cURL.
commands# Compilar e executar a aplicação
dotnet run
# Executar os testes unitários
dotnet testcurl_examples# Listar todos os produtos
curl -X GET http://localhost:5000/api/produto
# Criar um novo produto
curl -X POST -H "Content-Type: application/json" -d '{"Nome":"Novo Produto", "Preco":99.99}' http://localhost:5000/api/produto
Conclusão
Neste tutorial, você aprendeu a integrar aplicações legadas escritas em FoxPro com tecnologias modernas utilizando .NET e APIs REST. Desde a configuração do ambiente até a implementação de um serviço web completo, você agora possui uma base sólida para realizar integrações semelhantes em projetos futuros. Essa abordagem não apenas moderniza sistemas legados, mas também torna os dados mais acessíveis e manipuláveis por outras plataformas. Sinta-se à vontade para expandir essa base e explorar novas funcionalidades.