Docs 菜单
Docs 主页
/ / /
C#/ .NET驱动程序
/ /

教程:使用.NET/ C#驱动程序创建 RESTful API

在本教程中,您可以学习;了解如何创建带有端点的 RESTful API ,这些端点跨MongoDB Atlas 群集中的集合执行基本的创建、读取、更新和删除(增删改查 ) 操作。

在开始本教程之前,请执行以下操作:

  • 设置MongoDB Atlas帐户,并部署和配置 M0 或更高级别的集群。要查看说明,请参阅 Atlas入门指南

  • 在计算机上安装.NET6.0 或更高版本。要安装.NET,请访问Microsoft .NET下载页面。

注意

语言兼容性

本教程使用.NET Core 8.0,但您可以使用.NET 6.0 之后的任何版本。

在终端中运行以下命令,创建使用 Web应用程序模板的新.NET Core项目:

dotnet new webapi -o MongoExample
cd MongoExample

要将.NET/ C#驱动程序作为依赖项添加到项目中,运行以下命令:

dotnet add package MongoDB.Driver

前面的命令为.NET Core 创建一个名为 MongoExample 的新 Web应用程序项目,并安装最新的.NET/ C#驱动程序。模板项目包括一些样板文件,您可以修改这些文件以实现RESTful API。

在本部分中,您可以创建和配置MongoDB服务,并为 RESTful API定义数据模型。

1

MongoDB服务负责建立连接并直接处理MongoDB中的文档。在您的项目中,创建一个名为 Models 的文件夹。在 Models 文件夹中,创建一个名为 MongoDBSettings.cs 的新文件。在此文件中,添加以下代码:

namespace MongoExample.Models;
public class MongoDBSettings {
public string ConnectionURI { get; set; } = null!;
public string DatabaseName { get; set; } = null!;
public string CollectionName { get; set; } = null!;
}

前面的代码定义了一个名为 MongoDBSettings 的类,其中包含有关连接、数据库名称和集合名称的信息。

2

您可以在项目的 appsettings.json文件的 MongoDBSettings 类中定义的类字段中找到存储的数据。打开此文件并添加以下配置:

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"MongoDB": {
"ConnectionURI": "<Atlas connection string>",
"DatabaseName": "sample_mflix",
"CollectionName": "playlist"
}
}

本教程使用 sample_mflix 数据库和 playlist 集合。将 <Atlas connection string> 占位符替换为MongoDB Atlas连接字符串。有关如何查找连接字符串的更多信息,请参阅Atlas文档中的连接到集群教程。

3

在您的项目中,创建一个名为 Services 的文件夹。在 Services 文件夹中,创建名为 MongoDBService.cs 的新文件并添加以下代码:

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) { }
}

前面的代码定义了一个名为 MongoDBService 的类,其中包含空异步函数。在本教程中,您将在创建端点时向这些函数添加代码。您在 appsettings.json文件中配置的设置将设立变量。

4

打开 Program.cs文件并将以下代码添加到文件顶部:

using MongoExample.Models;
using MongoExample.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<MongoDBSettings>(builder.Configuration.GetSection("MongoDB"));
builder.Services.AddSingleton<MongoDBService>();

在前面的代码中,GetSection() 函数从 appsettings.json文件的 MongoDB字段中提取设置。

提示

如果模板代码已具有 builder 变量,请勿添加两次。

5

现在服务已设立,您可以为集合创建数据模型。

Models 文件夹中,创建名为 Playlist.cs 的新文件并添加以下代码:

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System.Text.Json.Serialization;
namespace MongoExample.Models;
public class Playlist {
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string? Id { get; set; }
public string username { get; set; } = null!;
[BsonElement("items")]
[JsonPropertyName("items")]
public List<string> movieIds { get; set; } = null!;
}

在前面的代码中,Id字段被序列化为 _id字段中的 ObjectId。该字段在应用程序中表示为字符串。

movieIds字段被序列化为 items。发送或接收JSON值时,该字段也命名为 items 而不是 movieIds

如果计划让本地类字段直接匹配文档字段,则无需定义自定义映射。示例,前面代码中的 username字段没有自定义映射。它在C#、 JSON和MongoDB中称为 be username

完成此步骤后,您的集合就拥有了MongoDB服务和文档模型,可以与.NET Core 一起使用。

要为此应用程序创建增删改查端点,必须更新项目中的两个不同文件。在本节中,您可以学习;了解如何在控制器中定义端点并在服务中更新相应的工作。

注意

数据验证

在此示例项目中,没有针对HTTP请求的数据验证。

1

在您的项目中,创建一个名为 Controllers 的文件夹。在 Controllers 文件夹中,创建名为 PlaylistController.cs 的新文件并添加以下代码:

using System;
using Microsoft.AspNetCore.Mvc;
using MongoExample.Services;
using MongoExample.Models;
namespace MongoExample.Controllers;
[Controller]
[Route("api/[controller]")]
public class PlaylistController: Controller {
private readonly MongoDBService _mongoDBService;
public PlaylistController(MongoDBService mongoDBService) {
_mongoDBService = mongoDBService;
}
[HttpGet]
public async Task<List<Playlist>> Get() {}
[HttpPost]
public async Task<IActionResult> Post([FromBody] Playlist playlist) {}
[HttpPut("{id}")]
public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(string id) {}
}

PlaylistController 类包含一个构造函数方法,用于获取对单例服务类的访问权限。然后,该控制器有一系列端点。

2

GoServices/MongoDBService.cs 并更新CreateAsync 函数以使用以下代码:

public async Task CreateAsync(Playlist playlist) {
await _playlistCollection.InsertOneAsync(playlist);
return;
}

前面的代码在服务的构造函数方法中设置了 _playlistCollection。此操作可让您的应用程序使用 InsertOneAsync 方法,该方法接受并插入传递的 Playlist 变量。

要完成 POST 端点的创建,请转到 Controllers/PlaylistController.cs文件并更新Post 方法以使用以下代码:

[HttpPost]
public async Task<IActionResult> Post([FromBody] Playlist playlist) {
await _mongoDBService.CreateAsync(playlist);
return CreatedAtAction(nameof(Get), new { id = playlist.Id }, playlist);
}

执行 POST 端点时,应用程序会从 request 获取.NET Core 解析的 Playlist对象,并将其传递给服务中的 CreateAsync 函数。插入后,代码会返回有关交互的信息。

3

GoServices/MongoDBService.cs 并更新GetAsync 函数以使用以下代码:

public async Task<List<Playlist>> GetAsync() {
return await _playlistCollection.Find(new BsonDocument()).ToListAsync();
}

上述代码中的 Find 操作会返回集合中存在的所有文档。

要完成 GET 端点的创建,请转到 Controllers/PlaylistController.cs文件并更新Get 方法以使用以下代码:

[HttpGet]
public async Task<List<Playlist>> Get() {
return await _mongoDBService.GetAsync();
}
4

GoServices/MongoDBService.cs 并更新AddToPlaylistAsync 函数以使用以下代码:

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;
}

前面的代码设置了一个匹配过滤,以确定哪个或哪些文档接收更新,在本例中,即向播放列表添加一个项目。该代码基于唯一的 Id字段进行匹配。然后,代码定义更新条件,这是一个 AddtoSet 操作,仅当大量中尚不存在项目时才将其添加到大量中。

即使匹配过滤返回多个匹配项,UpdateOneAsync 方法也仅对文档进行更新。

要完成 PUT 端点的创建,请转到 Controllers/PlaylistController.cs文件并更新AddToPlaylist 函数以使用以下代码:

[HttpPut("{id}")]
public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {
await _mongoDBService.AddToPlaylistAsync(id, movieId);
return NoContent();
}
5

GoServices/MongoDBService.cs 并更新DeleteAsync 函数以使用以下代码:

public async Task DeleteAsync(string id) {
FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id);
await _playlistCollection.DeleteOneAsync(filter);
return;
}

前面的代码根据过滤条件删除单个文档,该筛选条件与 Id字段的唯一值匹配。

要完成 DELETE 端点的创建,请转到 Controllers/PlaylistController.cs文件并更新Delete 函数以使用以下代码:

[HttpDelete("{id}")]
public async Task<IActionResult> Delete(string id) {
await _mongoDBService.DeleteAsync(id);
return NoContent();
}

在此步骤之后,您就拥有了 RESTful API的设立增删改查端点。

创建端点后,可以使用.NET Core应用程序模板包含的 Swagger用户界面对其进行测试。为此,请转到 Program.cs文件并从模板项目中删除与 WeatherForecast 类相关的所有代码。更新文件以包含以下代码:

// 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();

您可以将项目模板中的任何重复代码替换为前面的代码。

执行以下命令运行应用程序:

dotnet run

应用程序启动后,打开浏览器并转到配置的本地主机URL以访问权限Swagger用户界面,示例http://localhost:5000/swagger。下图显示了 Swagger用户界面的显示方式:

Swagger UI

RESTful API的 Swagger用户界面。

您可以通过单击每个端点上的 Try it out 按钮来测试应用程序。要开始,请转到 /api/playlists POST 端点向数据库添加一些数据。添加以下示例数据:

{
"username": "testuser",
"items": [
"1234",
"5678"
]
}

运行此请求以将数据插入数据库。然后,您可以转到 GET 端点查看刚刚插入的数据。您还可以测试 PUTDELETE 端点以更新和删除数据。

要学习;了解有关本教程中讨论的操作的更多信息,请参阅以下指南:

  • 插入文档

  • Retrieve Data

  • updateOne

  • Delete Documents

后退

指定查询结果

在此页面上