Tutorial: Criar uma API RESTful usando o driver .NET/C#
Visão geral
Neste tutorial, você pode aprender a criar uma API RESTful com endpoints que executam operações básicas de criação, leitura, atualização e exclusão (CRUD) em collections em um cluster do MongoDB Atlas .
Pré-requisitos
Antes de iniciar este tutorial, execute as seguintes ações:
Configure uma conta do MongoDB Atlas e implemente e configure um cluster que seja M0 ou superior. Para visualizar instruções, consulte o guia Introdução ao Atlas.
Instale o .NET 6.0 ou posterior em sua máquina. Para instalar o .NET, visite a página de download do Microsoft .NET.
Observação
Compatibilidade de linguagem
Este tutorial usa o .NET Core 8.0, mas você pode usar qualquer versão posterior ao .NET 6.0.
Configurar seu projeto
Execute os seguintes comandos no seu terminal para criar um novo projeto do .NET Core que use um modelo de aplicação da web:
dotnet new webapi -o MongoExample cd MongoExample
Para adicionar o driver .NET/C# ao seu projeto como uma dependência, execute o seguinte comando:
dotnet add package MongoDB.Driver
Os comandos anteriores criam um novo projeto de aplicação da web para o .NET Core chamado MongoExample
e instalam o driver .NET/C# mais recente. O projeto padrão inclui alguns arquivos padronizados que você modifica para implementar uma API RESTful.
Criar um modelo de documento e serviço de banco de dados
Nesta seção, você pode criar e configurar seu serviço MongoDB e definir o modelo de dados para sua API RESTful.
Criar a classe MongoDBSettings
Seu serviço MongoDB é responsável por estabelecer uma conexão e trabalhar diretamente com documentos no MongoDB. No seu projeto, crie uma pasta denominada Models
. Na pasta Models
, crie um novo arquivo denominado MongoDBSettings.cs
. Neste arquivo, adicione o seguinte código:
namespace MongoExample.Models; public class MongoDBSettings { public string ConnectionURI { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string CollectionName { get; set; } = null!; }
O código anterior define uma classe chamada MongoDBSettings
que contém informações sobre sua conexão, o nome do banco de dados e o nome da collection.
Atualize o arquivo appsettings.json
Você pode encontrar os dados armazenados nos campos de classe definidos na classe MongoDBSettings
no arquivo appsettings.json
dos projetos. Abra este arquivo e adicione a seguinte configuração:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "MongoDB": { "ConnectionURI": "<Atlas connection string>", "DatabaseName": "sample_mflix", "CollectionName": "playlist" } }
Este tutorial utiliza o banco de dados sample_mflix
e a collection playlist
. Substitua o espaço reservado <Atlas connection string>
pela string de conexão do MongoDB Atlas. Para mais informações sobre como localizar sua string de conexão, consulte o tutorial Connect to Your Cluster na documentação do Atlas.
Criar o serviço
No seu projeto, crie uma pasta denominada Services
. Na pasta Services
, crie um novo arquivo denominado MongoDBService.cs
e adicione o seguinte código:
using MongoExample.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Bson; namespace MongoExample.Services; public class MongoDBService { private readonly IMongoCollection<Playlist> _playlistCollection; public MongoDBService(IOptions<MongoDBSettings> mongoDBSettings) { MongoClient client = new MongoClient(mongoDBSettings.Value.ConnectionURI); IMongoDatabase database = client.GetDatabase(mongoDBSettings.Value.DatabaseName); _playlistCollection = database.GetCollection<Playlist>(mongoDBSettings.Value.CollectionName); } public async Task<List<Playlist>> GetAsync() { } public async Task CreateAsync(Playlist playlist) { } public async Task AddToPlaylistAsync(string id, string movieId) {} public async Task DeleteAsync(string id) { } }
O código anterior define uma classe denominada MongoDBService
que inclui funções assíncronas vazias. Ao longo deste tutorial, você adiciona código a essas funções à medida que cria seus endpoints. As configurações que você configurou no arquivo appsettings.json
estão definidas para variáveis.
Conecte o serviço ao aplicação
Abra o arquivo Program.cs
e adicione o seguinte código ao topo do arquivo:
using MongoExample.Models; using MongoExample.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.Configure<MongoDBSettings>(builder.Configuration.GetSection("MongoDB")); builder.Services.AddSingleton<MongoDBService>();
No código anterior, a função GetSection()
extrai suas configurações do campo MongoDB
no arquivo appsettings.json
.
Dica
Se o código do modelo já tiver a variável builder
, não a adicione duas vezes.
Criar o modelo de documento
Agora que o serviço está configurado, você pode criar um modelo de dados para a sua collection.
Na pasta Models
, crie um novo arquivo denominado Playlist.cs
e adicione o seguinte código:
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; namespace MongoExample.Models; public class Playlist { [ ] [ ] public string? Id { get; set; } public string username { get; set; } = null!; [ ] [ ] public List<string> movieIds { get; set; } = null!; }
No código anterior, o campo Id
é serializado como ObjectId
no campo _id
. O campo é representado como uma string em seu aplicação.
O campo movieIds
é serializado como items
. Quando você envia ou recebe valores JSON, o campo também é nomeado items
em vez de movieIds
.
Se você planeja que seu campo de classe local corresponda diretamente ao campo do documento , não é necessário definir mapeamentos personalizados. Por exemplo, o campo username
no código anterior não tem mapeamentos personalizados. É chamado username
em C#, em JSON e em MongoDB.
Após esta etapa, você tem um serviço MongoDB e um modelo de documento para sua coleção trabalhar com o .NET Core.
Criar endpoints CRUD
Para criar os endpoints CRUD para esse aplicação, você deve atualizar dois arquivos diferentes dentro do projeto. Nesta seção, você pode aprender como definir o endpoint dentro de um controlador e atualizar o trabalho correspondente dentro do serviço.
Observação
Validação de dados
Neste projeto de exemplo , não há validação de dados para as solicitações HTTP.
Criar um controlador
No seu projeto, crie uma pasta denominada Controllers
. Na pasta Controllers
, crie um novo arquivo denominado PlaylistController.cs
e adicione o seguinte código:
using System; using Microsoft.AspNetCore.Mvc; using MongoExample.Services; using MongoExample.Models; namespace MongoExample.Controllers; [ ][ ]public class PlaylistController: Controller { private readonly MongoDBService _mongoDBService; public PlaylistController(MongoDBService mongoDBService) { _mongoDBService = mongoDBService; } [ ] public async Task<List<Playlist>> Get() {} [ ] public async Task<IActionResult> Post([FromBody] Playlist playlist) {} [ ] public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {} [ ] public async Task<IActionResult> Delete(string id) {} }
A classe PlaylistController
contém um método de construtor que obtém acesso à sua classe de serviço singleton. Depois, há uma série de endpoints para esse controlador.
Adicionar dados por meio do endpoint POST
Vá para Services/MongoDBService.cs
e atualize a função CreateAsync
para utilizar o seguinte código:
public async Task CreateAsync(Playlist playlist) { await _playlistCollection.InsertOneAsync(playlist); return; }
O código anterior define o _playlistCollection
no método construtor do serviço. Isso permite que seu aplicação use o método InsertOneAsync
, que usa uma variável Playlist
passada e a insere.
Para concluir a criação do endpoint POST
, vá para o arquivo Controllers/PlaylistController.cs
e atualize o método Post
para utilizar o seguinte código:
[ ]public async Task<IActionResult> Post([FromBody] Playlist playlist) { await _mongoDBService.CreateAsync(playlist); return CreatedAtAction(nameof(Get), new { id = playlist.Id }, playlist); }
Quando o endpoint POST
é executado, o aplicação pega o objeto Playlist
do request
, que o .NET Core analisa, e o passa para a função CreateAsync
no serviço. Após a inserção, o código retorna informações sobre a interação.
Ler dados por meio do endpoint GET
Vá para Services/MongoDBService.cs
e atualize a função GetAsync
para utilizar o seguinte código:
public async Task<List<Playlist>> GetAsync() { return await _playlistCollection.Find(new BsonDocument()).ToListAsync(); }
A operação Find
no código anterior retorna todos os documentos existentes na coleção.
Para concluir a criação do endpoint GET
, vá para o arquivo Controllers/PlaylistController.cs
e atualize o método Get
para utilizar o seguinte código:
[ ]public async Task<List<Playlist>> Get() { return await _mongoDBService.GetAsync(); }
Atualizar dados usando o endpoint PUT
Vá para Services/MongoDBService.cs
e atualize a função AddToPlaylistAsync
para utilizar o seguinte código:
public async Task AddToPlaylistAsync(string id, string movieId) { FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id); UpdateDefinition<Playlist> update = Builders<Playlist>.Update.AddToSet<string>("movieIds", movieId); await _playlistCollection.UpdateOneAsync(filter, update); return; }
O código anterior define um filtro de correspondência para determinar quais documento recebem uma atualização, neste caso, adicionar um item à sua lista de reprodução. O código corresponde com base no campo Id
, que é único. Em seguida, o código define os critérios de atualização, que é uma operação AddtoSet
que só adiciona um item à array se ele ainda não existir na array.
Os métodos UpdateOneAsync
só atualizam no documento mesmo que o filtro de correspondência retorne mais de uma correspondência.
Para concluir a criação do ponto de extremidade PUT, acesse o arquivo Controllers/PlaylistController.cs
e atualize a função AddToPlaylist
para usar o seguinte código:
[ ]public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) { await _mongoDBService.AddToPlaylistAsync(id, movieId); return NoContent(); }
Excluir dados usando o endpoint DELETE
Vá para Services/MongoDBService.cs
e atualize a função DeleteAsync
para utilizar o seguinte código:
public async Task DeleteAsync(string id) { FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id); await _playlistCollection.DeleteOneAsync(filter); return; }
O código anterior exclui um único documento com base nos critérios de filtro, que corresponde ao valor exclusivo do campo Id
.
Para concluir a criação do endpoint DELETE, vá para o arquivo Controllers/PlaylistController.cs
e atualize a função Delete
para utilizar o seguinte código:
[ ]public async Task<IActionResult> Delete(string id) { await _mongoDBService.DeleteAsync(id); return NoContent(); }
Após esta etapa, você tem um conjunto completo de endpoints CRUD para sua API RESTful.
Teste os endpoints da API
Com os pontos de conexão criados, você pode testá-los usando a interface do usuário do MongoDB que está incluída no aplicação modelo do .NET Core. Para fazer isso, acesse o arquivo Program.cs
e remova qualquer código do projeto modelo relacionado à classe WeatherForecast
. Atualize o arquivo para incluir o seguinte código:
// Adds services to the container to configure Swagger/OpenAPI builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configures the HTTP request pipeline if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // Maps the endpoints for the API app.MapGet("/api/playlists", async (MongoDBService mongoDBService) => { var playlists = await mongoDBService.GetAsync(); return playlists; }) .WithName("GetPlaylists") .WithOpenApi(); app.MapPost("/api/playlists", async (MongoDBService mongoDBService, Playlist newPlaylist) => { await mongoDBService.CreateAsync(newPlaylist); return Results.Created($"/playlists/{newPlaylist.Id}", newPlaylist); }) .WithName("CreatePlaylist") .WithOpenApi(); app.MapPut("/api/playlists/{id}", async (MongoDBService mongoDBService, string id, string movieId) => { await mongoDBService.AddToPlaylistAsync(id, movieId); return Results.NoContent(); }) .WithName("AddMovieToPlaylist") .WithOpenApi(); app.MapDelete("/playlists/{id}", async (MongoDBService mongoDBService, string id) => { await mongoDBService.DeleteAsync(id); return Results.NoContent(); }) .WithName("DeletePlaylist") .WithOpenApi(); app.Run();
Você pode substituir qualquer código repetitivo do modelo de projeto pelo código anterior.
Execute o seguinte comando para executar seu aplicação:
dotnet run
Após o início do aplicação , abra seu navegador e vá para o URL do localhost configurado para acessar a UI do Atlas, por exemplo http://localhost:5000/swagger
. A imagem a seguir mostra como a interface do usuário do MongoDB aparece:

A UI do MongoDB para a API RESTful.
Você pode testar o aplicação clicando no botão Try it out em cada endpoint. Para começar, vá para o endpoint /api/playlists
POST
para adicionar alguns dados ao banco de dados. Adicione os seguintes dados de amostra:
{ "username": "testuser", "items": [ "1234", "5678" ] }
Execute esta solicitação para inserir dados no banco de dados. Você pode então ir para o endpoint GET
para visualizar os dados que acabou de inserir. Você também pode testar os endpoints PUT
e DELETE
para atualizar e excluir dados.
Próximos passos
Para saber mais sobre as operações abordadas neste tutorial, consulte os seguintes guias: