Vytvoření webového rozhraní API pomocí ASP.NET Core a MongoDB
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Pratik Khandelwal a Scott Addie
Tento kurz vytvoří webové rozhraní API, na kterém běží operace Create, Read, Update a Delete (CRUD) v databázi MongoDB NoSQL.
V tomto kurzu se naučíte:
- Konfigurace MongoDB
- Vytvoření databáze MongoDB
- Definování kolekce a schématu MongoDB
- Provádění operací CRUD MongoDB z webového rozhraní API
- Přizpůsobení serializace JSON
Požadavky
Sada Visual Studio 2022 se sadou funkcí Vývoj pro ASP.NET a web
Konfigurace MongoDB
Povolení přístupu k Prostředí MongoDB a MongoDB odkudkoli na vývojovém počítači (Windows/Linux/macOS):
Stáhněte a nainstalujte prostředí MongoDB:
- macOS/Linux: Zvolte adresář pro extrahování prostředí MongoDB. Přidejte výslednou cestu k
mongosh
PATH
proměnné prostředí. - Windows: Prostředí MongoDB (mongosh.exe) je nainstalované v C:\Users<user>\AppData\Local\Programs\mongosh. Přidejte výslednou cestu k
mongosh.exe
PATH
proměnné prostředí.
- macOS/Linux: Zvolte adresář pro extrahování prostředí MongoDB. Přidejte výslednou cestu k
Stáhněte a nainstalujte MongoDB:
- macOS/Linux: Ověřte adresář, na který se nainstaloval MongoDB, obvykle v adresáři /usr/local/mongodb. Přidejte výslednou cestu k
mongodb
PATH
proměnné prostředí. - Windows: MongoDB je ve výchozím nastavení nainstalovaný v C:\Program Files\MongoDB . Do proměnné prostředí přidejte C:\Program Files\MongoDB\Server\<version_number>\bin
PATH
.
- macOS/Linux: Ověřte adresář, na který se nainstaloval MongoDB, obvykle v adresáři /usr/local/mongodb. Přidejte výslednou cestu k
Zvolte adresář úložiště dat: Vyberte adresář na vývojovém počítači pro ukládání dat. Pokud adresář neexistuje, vytvořte ho. Prostředí MongoDB nevytvoří nové adresáře:
- macOS/Linux: Například
/usr/local/var/mongodb
. - Windows: Příklad
C:\\BooksData
: .
- macOS/Linux: Například
V příkazovém prostředí operačního systému (ne v Prostředí MongoDB) se pomocí následujícího příkazu připojte k MongoDB na výchozím portu 27017. Nahraďte
<data_directory_path>
adresářem zvoleným v předchozím kroku.mongod --dbpath <data_directory_path>
Pomocí dříve nainstalovaného Prostředí MongoDB v následujících krocích vytvořte databázi, vytvořte kolekce a ukládejte dokumenty. Další informace o příkazech prostředí MongoDB najdete v tématu mongosh
.
Spuštěním příkazu
mongosh.exe
otevřete instanci příkazového prostředí MongoDB .V příkazovém prostředí se připojte k výchozí testovací databázi spuštěním následujícího příkazu:
mongosh
V příkazovém prostředí spusťte následující příkaz:
use BookStore
Databáze s názvem BookStore se vytvoří, pokud ještě neexistuje. Pokud databáze existuje, otevře se její připojení pro transakce.
Vytvořte kolekci
Books
pomocí následujícího příkazu:db.createCollection('Books')
Zobrazí se následující výsledek:
{ "ok" : 1 }
Pomocí následujícího příkazu definujte schéma kolekce
Books
a vložte dva dokumenty:db.Books.insertMany([{ "Name": "Design Patterns", "Price": 54.93, "Category": "Computers", "Author": "Ralph Johnson" }, { "Name": "Clean Code", "Price": 43.15, "Category": "Computers","Author": "Robert C. Martin" }])
Zobrazí se výsledek podobný následujícímu:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }
Poznámka:
Zobrazené
ObjectId
v předchozím výsledku se neshodují s těmi, které se zobrazují v příkazovém prostředí.K zobrazení dokumentů v databázi použijte následující příkaz:
db.Books.find().pretty()
Zobrazí se výsledek podobný následujícímu:
{ "_id" : ObjectId("61a6058e6c43f32854e51f51"), "Name" : "Design Patterns", "Price" : 54.93, "Category" : "Computers", "Author" : "Ralph Johnson" } { "_id" : ObjectId("61a6058e6c43f32854e51f52"), "Name" : "Clean Code", "Price" : 43.15, "Category" : "Computers", "Author" : "Robert C. Martin" }
Schéma přidá automaticky vygenerovanou
_id
vlastnost typuObjectId
pro každý dokument.
Vytvoření projektu webového rozhraní API ASP.NET Core
Přejděte na Soubor>nový>projekt.
Vyberte typ projektu základního webového rozhraní API ASP.NET a vyberte Další.
Pojmenujte projekt BookStoreApi a vyberte Další.
Vyberte architekturu .NET 8.0 (dlouhodobá podpora) a vyberte Vytvořit.
V okně konzoly Správce balíčků přejděte do kořenového adresáře projektu. Spuštěním následujícího příkazu nainstalujte ovladač .NET pro MongoDB:
Install-Package MongoDB.Driver
Přidání modelu entity
Přidejte adresář Models do kořenového adresáře projektu.
Book
Do adresáře Models přidejte třídu s následujícím kódem:using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace BookStoreApi.Models; public class Book { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } [BsonElement("Name")] public string BookName { get; set; } = null!; public decimal Price { get; set; } public string Category { get; set; } = null!; public string Author { get; set; } = null!; }
V předchozí třídě
Id
je vlastnost:- Vyžadováno pro mapování objektu CLR (Common Language Runtime) na kolekci MongoDB.
- Anotováno tak,
[BsonId]
aby tato vlastnost byla primárním klíčem dokumentu. - Anotace s povolením
[BsonRepresentation(BsonType.ObjectId)]
předání parametru jako typustring
místo objektové struktury. Mongo zpracovává převod zstring
naObjectId
.
Vlastnost
BookName
je opatřena poznámkami atributu[BsonElement]
. Hodnota atributuName
představuje název vlastnosti v kolekci MongoDB.
Přidání konfiguračního modelu
Přidejte následující hodnoty konfigurace databáze do
appsettings.json
:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
BookStoreDatabaseSettings
Do adresáře Models přidejte třídu s následujícím kódem:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }
Předchozí
BookStoreDatabaseSettings
třída se používá k uloženíappsettings.json
hodnot vlastností souboruBookStoreDatabase
. Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.Přidejte následující zvýrazněný kód do
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));
V předchozím kódu je instance konfigurace, na kterou
appsettings.json
se oddíl souboruBookStoreDatabase
sváže, zaregistrována v kontejneru Injektáž závislostí (DI). Například vlastnost objektuBookStoreDatabaseSettings
ConnectionString
je naplněnaBookStoreDatabase:ConnectionString
vlastností vappsettings.json
.Na začátek
Program.cs
BookStoreDatabaseSettings
odkazu přidejte následující kód:using BookStoreApi.Models;
Přidání služby operací CRUD
Přidejte adresář Služeb do kořenového adresáře projektu.
BooksService
Do adresáře Services přidejte třídu s následujícím kódem:using BookStoreApi.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace BookStoreApi.Services; public class BooksService { private readonly IMongoCollection<Book> _booksCollection; public BooksService( IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { var mongoClient = new MongoClient( bookStoreDatabaseSettings.Value.ConnectionString); var mongoDatabase = mongoClient.GetDatabase( bookStoreDatabaseSettings.Value.DatabaseName); _booksCollection = mongoDatabase.GetCollection<Book>( bookStoreDatabaseSettings.Value.BooksCollectionName); } public async Task<List<Book>> GetAsync() => await _booksCollection.Find(_ => true).ToListAsync(); public async Task<Book?> GetAsync(string id) => await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync(); public async Task CreateAsync(Book newBook) => await _booksCollection.InsertOneAsync(newBook); public async Task UpdateAsync(string id, Book updatedBook) => await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook); public async Task RemoveAsync(string id) => await _booksCollection.DeleteOneAsync(x => x.Id == id); }
V předchozím kódu
BookStoreDatabaseSettings
se instance načte z DI prostřednictvím injektáže konstruktoru. Tato technika poskytuje přístup kappsettings.json
hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .Přidejte následující zvýrazněný kód do
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();
V předchozím kódu
BooksService
je třída registrována v di kvůli podpoře injektáže konstruktoru ve spotřebě tříd. Životnost jednoúčelové služby je nejvhodnější, protožeBooksService
využívá přímou závislost naMongoClient
. V souladu s oficiálními pokynyMongoClient
pro opakované použití klienta Mongo by se měl zaregistrovat v DI s jednou životností služby.Na začátek
Program.cs
BooksService
odkazu přidejte následující kód:using BookStoreApi.Services;
Třída BooksService
používá následující MongoDB.Driver
členy ke spuštění operací CRUD s databází:
MongoClient: Načte instanci serveru pro spouštění databázových operací. Konstruktor této třídy je k dispozici v MongoDB připojovací řetězec:
public BooksService( IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { var mongoClient = new MongoClient( bookStoreDatabaseSettings.Value.ConnectionString); var mongoDatabase = mongoClient.GetDatabase( bookStoreDatabaseSettings.Value.DatabaseName); _booksCollection = mongoDatabase.GetCollection<Book>( bookStoreDatabaseSettings.Value.BooksCollectionName); }
IMongoDatabase: Představuje databázi Mongo pro spuštěné operace. Tento kurz používá obecnou metodu GetCollection<TDocument>(collection) v rozhraní k získání přístupu k datům v konkrétní kolekci. Po volání této metody spusťte operace CRUD s kolekcí.
GetCollection<TDocument>(collection)
Volání metody:collection
představuje název kolekce.TDocument
představuje typ objektu CLR uložený v kolekci.
GetCollection<TDocument>(collection)
vrátí MongoCollection objekt představující kolekci. V tomto kurzu jsou v kolekci vyvolány následující metody:
- DeleteOneAsync: Odstraní jeden dokument odpovídající zadaným kritériím hledání.
- Najít<TDocument>: Vrátí všechny dokumenty v kolekci odpovídající zadaným kritériím hledání.
- InsertOneAsync: Vloží zadaný objekt jako nový dokument v kolekci.
- ReplaceOneAsync: Nahradí jeden dokument odpovídající zadaným kritériím hledání zadaným objektem.
Přidání kontroleru
BooksController
Přidejte třídu do adresáře Controllers s následujícím kódem:
using BookStoreApi.Models;
using BookStoreApi.Services;
using Microsoft.AspNetCore.Mvc;
namespace BookStoreApi.Controllers;
[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
private readonly BooksService _booksService;
public BooksController(BooksService booksService) =>
_booksService = booksService;
[HttpGet]
public async Task<List<Book>> Get() =>
await _booksService.GetAsync();
[HttpGet("{id:length(24)}")]
public async Task<ActionResult<Book>> Get(string id)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
return book;
}
[HttpPost]
public async Task<IActionResult> Post(Book newBook)
{
await _booksService.CreateAsync(newBook);
return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
}
[HttpPut("{id:length(24)}")]
public async Task<IActionResult> Update(string id, Book updatedBook)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
updatedBook.Id = book.Id;
await _booksService.UpdateAsync(id, updatedBook);
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public async Task<IActionResult> Delete(string id)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
await _booksService.RemoveAsync(id);
return NoContent();
}
}
Předchozí kontroler webového rozhraní API:
BooksService
Používá třídu ke spuštění operací CRUD.- Obsahuje metody akcí pro podporu požadavků GET, POST, PUT a DELETE HTTP.
- Volání CreatedAtAction v
Create
metodě akce k vrácení odpovědi HTTP 201 Stavový kód 201 je standardní odpověď pro metodu HTTP POST, která na serveru vytvoří nový prostředek.CreatedAtAction
také přidá hlavičkuLocation
do odpovědi. HlavičkaLocation
určuje identifikátor URI nově vytvořené knihy.
Testování webového rozhraní API
Sestavte a spusťte aplikaci.
Přejděte do
https://localhost:<port>/api/books
umístění , kde<port>
je automaticky přiřazené číslo portu aplikace, a otestujte metodu akce bezGet
parametrů kontroleru, vyberte Vyzkoušet provést>. Zobrazí se odpověď JSON podobná následující:[ { "id": "61a6058e6c43f32854e51f51", "bookName": "Design Patterns", "price": 54.93, "category": "Computers", "author": "Ralph Johnson" }, { "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" } ]
Přejděte k
https://localhost:<port>/api/books/{id here}
otestování přetíženéGet
metody akce kontroleru. Zobrazí se odpověď JSON podobná následující:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Konfigurace možností serializace JSON
V části Test webového rozhraní API je potřeba změnit dvě podrobnosti o odpovědích JSON:
- Výchozí velikost písmen velbloudího jména vlastností by se měla změnit tak, aby odpovídala písmenům pascalu názvů vlastností objektu CLR.
- Vlastnost
bookName
by měla být vrácena jakoName
.
Pokud chcete splnit předchozí požadavky, proveďte následující změny:
V
Program.cs
zřetězte následující zvýrazněný kód voláníAddControllers
metody:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>(); builder.Services.AddControllers() .AddJsonOptions( options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
Při předchozí změně se názvy vlastností v serializované odpovědi JSON webového rozhraní API shodují s odpovídajícími názvy vlastností v typu objektu CLR.
Book
Například vlastnost třídyAuthor
serializuje jakoAuthor
místoauthor
.V
Models/Book.cs
, anotaceBookName
vlastnost s atributem[JsonPropertyName]
:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;
Hodnota
[JsonPropertyName]
atributuName
představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.Na začátek
Models/Book.cs
překladu odkazu na[JsonProperty]
atribut přidejte následující kód:using System.Text.Json.Serialization;
Opakujte kroky definované v části Test webového rozhraní API . Všimněte si rozdílu v názvech vlastností JSON.
Přidání podpory ověřování do webového rozhraní API
ASP.NET Core Identity přidává do webových aplikací ASP.NET Core funkce přihlášení uživatelského rozhraní. K zabezpečení webových rozhraní API a spA použijte jednu z následujících možností:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server je architektura OpenID Connect a OAuth 2.0 pro ASP.NET Core. Duende Identity Server umožňuje následující funkce zabezpečení:
- Ověřování jako služba (AaaS)
- Jednotné přihlašování nebo vypnutí (SSO) u více typů aplikací
- Řízení přístupu pro rozhraní API
- Federační brána
Důležité
Duende Software může vyžadovat, abyste zaplatili licenční poplatek za produkční využití serveru Duende Identity Server. Další informace najdete v tématu Migrace z ASP.NET Core 5.0 na verzi 6.0.
Další informace najdete v dokumentaci k Duende Identity Serveru (web Duende Software).
Další materiály
Tento kurz vytvoří webové rozhraní API, na kterém běží operace Create, Read, Update a Delete (CRUD) v databázi MongoDB NoSQL.
V tomto kurzu se naučíte:
- Konfigurace MongoDB
- Vytvoření databáze MongoDB
- Definování kolekce a schématu MongoDB
- Provádění operací CRUD MongoDB z webového rozhraní API
- Přizpůsobení serializace JSON
Požadavky
Sada Visual Studio 2022 se sadou funkcí Vývoj pro ASP.NET a web
Konfigurace MongoDB
Povolte přístup k Prostředí MongoDB a Mongo DB odkudkoli na vývojovém počítači:
Ve Windows je MongoDB ve výchozím nastavení nainstalovaný ve složce C:\Program Files\MongoDB . Do proměnné prostředí přidejte C:\Program Files\MongoDB\Server\<version_number>\bin
PATH
.Stáhněte si Prostředí MongoDB a zvolte adresář, do něhož ho chcete extrahovat. Přidejte výslednou cestu k
mongosh.exe
PATH
proměnné prostředí.Zvolte adresář na vývojovém počítači pro ukládání dat. Například C:\BooksData ve Windows. Pokud adresář neexistuje, vytvořte ho. Prostředí Mongo Shell nevytvoří nové adresáře.
V příkazovém prostředí operačního systému (ne v Prostředí MongoDB) se pomocí následujícího příkazu připojte k MongoDB na výchozím portu 27017. Nahraďte
<data_directory_path>
adresářem zvoleným v předchozím kroku.mongod --dbpath <data_directory_path>
Pomocí dříve nainstalovaného Prostředí MongoDB v následujících krocích vytvořte databázi, vytvořte kolekce a ukládejte dokumenty. Další informace o příkazech prostředí MongoDB najdete v tématu mongosh
.
Spuštěním příkazu
mongosh.exe
otevřete instanci příkazového prostředí MongoDB .V příkazovém prostředí se připojte k výchozí testovací databázi spuštěním následujícího příkazu:
mongosh
V příkazovém prostředí spusťte následující příkaz:
use BookStore
Databáze s názvem BookStore se vytvoří, pokud ještě neexistuje. Pokud databáze existuje, otevře se její připojení pro transakce.
Vytvořte kolekci
Books
pomocí následujícího příkazu:db.createCollection('Books')
Zobrazí se následující výsledek:
{ "ok" : 1 }
Pomocí následujícího příkazu definujte schéma kolekce
Books
a vložte dva dokumenty:db.Books.insertMany([{ "Name": "Design Patterns", "Price": 54.93, "Category": "Computers", "Author": "Ralph Johnson" }, { "Name": "Clean Code", "Price": 43.15, "Category": "Computers","Author": "Robert C. Martin" }])
Zobrazí se výsledek podobný následujícímu:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }
Poznámka:
Zobrazené
ObjectId
v předchozím výsledku se neshodují s těmi, které se zobrazují v příkazovém prostředí.K zobrazení dokumentů v databázi použijte následující příkaz:
db.Books.find().pretty()
Zobrazí se výsledek podobný následujícímu:
{ "_id" : ObjectId("61a6058e6c43f32854e51f51"), "Name" : "Design Patterns", "Price" : 54.93, "Category" : "Computers", "Author" : "Ralph Johnson" } { "_id" : ObjectId("61a6058e6c43f32854e51f52"), "Name" : "Clean Code", "Price" : 43.15, "Category" : "Computers", "Author" : "Robert C. Martin" }
Schéma přidá automaticky vygenerovanou
_id
vlastnost typuObjectId
pro každý dokument.
Vytvoření projektu webového rozhraní API ASP.NET Core
Přejděte na Soubor>nový>projekt.
Vyberte typ projektu základního webového rozhraní API ASP.NET a vyberte Další.
Pojmenujte projekt BookStoreApi a vyberte Další.
Vyberte architekturu .NET 7.0 (Standardní podpora termínů) a vyberte Vytvořit.
V nabídce Nástroje vyberte Správce balíčků> NuGet Správce balíčků Konzola.
V okně konzoly Správce balíčků přejděte do kořenového adresáře projektu. Spuštěním následujícího příkazu nainstalujte ovladač .NET pro MongoDB:
Install-Package MongoDB.Driver
Přidání modelu entity
Přidejte adresář Models do kořenového adresáře projektu.
Book
Do adresáře Models přidejte třídu s následujícím kódem:using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace BookStoreApi.Models; public class Book { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } [BsonElement("Name")] public string BookName { get; set; } = null!; public decimal Price { get; set; } public string Category { get; set; } = null!; public string Author { get; set; } = null!; }
V předchozí třídě
Id
je vlastnost:- Vyžadováno pro mapování objektu CLR (Common Language Runtime) na kolekci MongoDB.
- Anotováno tak,
[BsonId]
aby tato vlastnost byla primárním klíčem dokumentu. - Anotace s povolením
[BsonRepresentation(BsonType.ObjectId)]
předání parametru jako typustring
místo objektové struktury. Mongo zpracovává převod zstring
naObjectId
.
Vlastnost
BookName
je opatřena poznámkami atributu[BsonElement]
. Hodnota atributuName
představuje název vlastnosti v kolekci MongoDB.
Přidání konfiguračního modelu
Přidejte následující hodnoty konfigurace databáze do
appsettings.json
:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
BookStoreDatabaseSettings
Do adresáře Models přidejte třídu s následujícím kódem:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }
Předchozí
BookStoreDatabaseSettings
třída se používá k uloženíappsettings.json
hodnot vlastností souboruBookStoreDatabase
. Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.Přidejte následující zvýrazněný kód do
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));
V předchozím kódu je instance konfigurace, na kterou
appsettings.json
se oddíl souboruBookStoreDatabase
sváže, zaregistrována v kontejneru Injektáž závislostí (DI). Například vlastnost objektuBookStoreDatabaseSettings
ConnectionString
je naplněnaBookStoreDatabase:ConnectionString
vlastností vappsettings.json
.Na začátek
Program.cs
BookStoreDatabaseSettings
odkazu přidejte následující kód:using BookStoreApi.Models;
Přidání služby operací CRUD
Přidejte adresář Služeb do kořenového adresáře projektu.
BooksService
Do adresáře Services přidejte třídu s následujícím kódem:using BookStoreApi.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace BookStoreApi.Services; public class BooksService { private readonly IMongoCollection<Book> _booksCollection; public BooksService( IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { var mongoClient = new MongoClient( bookStoreDatabaseSettings.Value.ConnectionString); var mongoDatabase = mongoClient.GetDatabase( bookStoreDatabaseSettings.Value.DatabaseName); _booksCollection = mongoDatabase.GetCollection<Book>( bookStoreDatabaseSettings.Value.BooksCollectionName); } public async Task<List<Book>> GetAsync() => await _booksCollection.Find(_ => true).ToListAsync(); public async Task<Book?> GetAsync(string id) => await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync(); public async Task CreateAsync(Book newBook) => await _booksCollection.InsertOneAsync(newBook); public async Task UpdateAsync(string id, Book updatedBook) => await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook); public async Task RemoveAsync(string id) => await _booksCollection.DeleteOneAsync(x => x.Id == id); }
V předchozím kódu
BookStoreDatabaseSettings
se instance načte z DI prostřednictvím injektáže konstruktoru. Tato technika poskytuje přístup kappsettings.json
hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .Přidejte následující zvýrazněný kód do
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();
V předchozím kódu
BooksService
je třída registrována v di kvůli podpoře injektáže konstruktoru ve spotřebě tříd. Životnost jednoúčelové služby je nejvhodnější, protožeBooksService
využívá přímou závislost naMongoClient
. V souladu s oficiálními pokynyMongoClient
pro opakované použití klienta Mongo by se měl zaregistrovat v DI s jednou životností služby.Na začátek
Program.cs
BooksService
odkazu přidejte následující kód:using BookStoreApi.Services;
Třída BooksService
používá následující MongoDB.Driver
členy ke spuštění operací CRUD s databází:
MongoClient: Načte instanci serveru pro spouštění databázových operací. Konstruktor této třídy je poskytován MongoDB připojovací řetězec:
public BooksService( IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { var mongoClient = new MongoClient( bookStoreDatabaseSettings.Value.ConnectionString); var mongoDatabase = mongoClient.GetDatabase( bookStoreDatabaseSettings.Value.DatabaseName); _booksCollection = mongoDatabase.GetCollection<Book>( bookStoreDatabaseSettings.Value.BooksCollectionName); }
IMongoDatabase: Představuje databázi Mongo pro spuštěné operace. Tento kurz používá obecnou metodu GetCollection<TDocument>(collection) v rozhraní k získání přístupu k datům v konkrétní kolekci. Po volání této metody spusťte operace CRUD s kolekcí.
GetCollection<TDocument>(collection)
Volání metody:collection
představuje název kolekce.TDocument
představuje typ objektu CLR uložený v kolekci.
GetCollection<TDocument>(collection)
vrátí MongoCollection objekt představující kolekci. V tomto kurzu jsou v kolekci vyvolány následující metody:
- DeleteOneAsync: Odstraní jeden dokument odpovídající zadaným kritériím hledání.
- Najít<TDocument>: Vrátí všechny dokumenty v kolekci odpovídající zadaným kritériím hledání.
- InsertOneAsync: Vloží zadaný objekt jako nový dokument v kolekci.
- ReplaceOneAsync: Nahradí jeden dokument odpovídající zadaným kritériím hledání zadaným objektem.
Přidání kontroleru
BooksController
Přidejte třídu do adresáře Controllers s následujícím kódem:
using BookStoreApi.Models;
using BookStoreApi.Services;
using Microsoft.AspNetCore.Mvc;
namespace BookStoreApi.Controllers;
[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
private readonly BooksService _booksService;
public BooksController(BooksService booksService) =>
_booksService = booksService;
[HttpGet]
public async Task<List<Book>> Get() =>
await _booksService.GetAsync();
[HttpGet("{id:length(24)}")]
public async Task<ActionResult<Book>> Get(string id)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
return book;
}
[HttpPost]
public async Task<IActionResult> Post(Book newBook)
{
await _booksService.CreateAsync(newBook);
return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
}
[HttpPut("{id:length(24)}")]
public async Task<IActionResult> Update(string id, Book updatedBook)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
updatedBook.Id = book.Id;
await _booksService.UpdateAsync(id, updatedBook);
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public async Task<IActionResult> Delete(string id)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
await _booksService.RemoveAsync(id);
return NoContent();
}
}
Předchozí kontroler webového rozhraní API:
BooksService
Používá třídu ke spuštění operací CRUD.- Obsahuje metody akcí pro podporu požadavků GET, POST, PUT a DELETE HTTP.
- Volání CreatedAtAction v
Create
metodě akce k vrácení odpovědi HTTP 201 Stavový kód 201 je standardní odpověď pro metodu HTTP POST, která na serveru vytvoří nový prostředek.CreatedAtAction
také přidá hlavičkuLocation
do odpovědi. HlavičkaLocation
určuje identifikátor URI nově vytvořené knihy.
Testování webového rozhraní API
Sestavte a spusťte aplikaci.
Přejděte do
https://localhost:<port>/api/books
umístění , kde<port>
je automaticky přiřazené číslo portu aplikace a otestujte metodu akce bezGet
parametrů kontroleru. Zobrazí se odpověď JSON podobná následující:[ { "id": "61a6058e6c43f32854e51f51", "bookName": "Design Patterns", "price": 54.93, "category": "Computers", "author": "Ralph Johnson" }, { "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" } ]
Přejděte k
https://localhost:<port>/api/books/{id here}
otestování přetíženéGet
metody akce kontroleru. Zobrazí se odpověď JSON podobná následující:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Konfigurace možností serializace JSON
V části Test webového rozhraní API je potřeba změnit dvě podrobnosti o odpovědích JSON:
- Výchozí velikost písmen velbloudího jména vlastností by se měla změnit tak, aby odpovídala písmenům pascalu názvů vlastností objektu CLR.
- Vlastnost
bookName
by měla být vrácena jakoName
.
Pokud chcete splnit předchozí požadavky, proveďte následující změny:
V
Program.cs
zřetězte následující zvýrazněný kód voláníAddControllers
metody:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>(); builder.Services.AddControllers() .AddJsonOptions( options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
Při předchozí změně se názvy vlastností v serializované odpovědi JSON webového rozhraní API shodují s odpovídajícími názvy vlastností v typu objektu CLR.
Book
Například vlastnost třídyAuthor
serializuje jakoAuthor
místoauthor
.V
Models/Book.cs
, anotaceBookName
vlastnost s atributem[JsonPropertyName]
:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;
Hodnota
[JsonPropertyName]
atributuName
představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.Na začátek
Models/Book.cs
překladu odkazu na[JsonProperty]
atribut přidejte následující kód:using System.Text.Json.Serialization;
Opakujte kroky definované v části Test webového rozhraní API . Všimněte si rozdílu v názvech vlastností JSON.
Přidání podpory ověřování do webového rozhraní API
ASP.NET Core Identity přidává do webových aplikací ASP.NET Core funkce přihlášení uživatelského rozhraní. K zabezpečení webových rozhraní API a spA použijte jednu z následujících možností:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server je architektura OpenID Connect a OAuth 2.0 pro ASP.NET Core. Duende Identity Server umožňuje následující funkce zabezpečení:
- Ověřování jako služba (AaaS)
- Jednotné přihlašování nebo vypnutí (SSO) u více typů aplikací
- Řízení přístupu pro rozhraní API
- Federační brána
Důležité
Duende Software může vyžadovat, abyste zaplatili licenční poplatek za produkční využití serveru Duende Identity Server. Další informace najdete v tématu Migrace z ASP.NET Core 5.0 na verzi 6.0.
Další informace najdete v dokumentaci k Duende Identity Serveru (web Duende Software).
Další materiály
Tento kurz vytvoří webové rozhraní API, na kterém běží operace Create, Read, Update a Delete (CRUD) v databázi MongoDB NoSQL.
V tomto kurzu se naučíte:
- Konfigurace MongoDB
- Vytvoření databáze MongoDB
- Definování kolekce a schématu MongoDB
- Provádění operací CRUD MongoDB z webového rozhraní API
- Přizpůsobení serializace JSON
Požadavky
- Sada Visual Studio 2022 se sadou funkcí Vývoj pro ASP.NET a web
- Sada .NET 6.0 SDK
Konfigurace MongoDB
Povolte přístup k Prostředí MongoDB a Mongo DB odkudkoli na vývojovém počítači:
Ve Windows je MongoDB ve výchozím nastavení nainstalovaný ve složce C:\Program Files\MongoDB . Do proměnné prostředí přidejte C:\Program Files\MongoDB\Server\<version_number>\bin
PATH
.Stáhněte si Prostředí MongoDB a zvolte adresář, do něhož ho chcete extrahovat. Přidejte výslednou cestu k
mongosh.exe
PATH
proměnné prostředí.Zvolte adresář na vývojovém počítači pro ukládání dat. Například C:\BooksData ve Windows. Pokud adresář neexistuje, vytvořte ho. Prostředí Mongo Shell nevytvoří nové adresáře.
V příkazovém prostředí operačního systému (ne v Prostředí MongoDB) se pomocí následujícího příkazu připojte k MongoDB na výchozím portu 27017. Nahraďte
<data_directory_path>
adresářem zvoleným v předchozím kroku.mongod --dbpath <data_directory_path>
Pomocí dříve nainstalovaného Prostředí MongoDB v následujících krocích vytvořte databázi, vytvořte kolekce a ukládejte dokumenty. Další informace o příkazech prostředí MongoDB najdete v tématu mongosh
.
Spuštěním příkazu
mongosh.exe
otevřete instanci příkazového prostředí MongoDB .V příkazovém prostředí se připojte k výchozí testovací databázi spuštěním následujícího příkazu:
mongosh
V příkazovém prostředí spusťte následující příkaz:
use BookStore
Databáze s názvem BookStore se vytvoří, pokud ještě neexistuje. Pokud databáze existuje, otevře se její připojení pro transakce.
Vytvořte kolekci
Books
pomocí následujícího příkazu:db.createCollection('Books')
Zobrazí se následující výsledek:
{ "ok" : 1 }
Pomocí následujícího příkazu definujte schéma kolekce
Books
a vložte dva dokumenty:db.Books.insertMany([{ "Name": "Design Patterns", "Price": 54.93, "Category": "Computers", "Author": "Ralph Johnson" }, { "Name": "Clean Code", "Price": 43.15, "Category": "Computers","Author": "Robert C. Martin" }])
Zobrazí se výsledek podobný následujícímu:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("61a6058e6c43f32854e51f51"), ObjectId("61a6058e6c43f32854e51f52") ] }
Poznámka:
Zobrazené
ObjectId
v předchozím výsledku se neshodují s těmi, které se zobrazují v příkazovém prostředí.K zobrazení dokumentů v databázi použijte následující příkaz:
db.Books.find().pretty()
Zobrazí se výsledek podobný následujícímu:
{ "_id" : ObjectId("61a6058e6c43f32854e51f51"), "Name" : "Design Patterns", "Price" : 54.93, "Category" : "Computers", "Author" : "Ralph Johnson" } { "_id" : ObjectId("61a6058e6c43f32854e51f52"), "Name" : "Clean Code", "Price" : 43.15, "Category" : "Computers", "Author" : "Robert C. Martin" }
Schéma přidá automaticky vygenerovanou
_id
vlastnost typuObjectId
pro každý dokument.
Vytvoření projektu webového rozhraní API ASP.NET Core
Přejděte na Soubor>nový>projekt.
Vyberte typ projektu základního webového rozhraní API ASP.NET a vyberte Další.
Pojmenujte projekt BookStoreApi a vyberte Další.
Vyberte architekturu .NET 6.0 (dlouhodobá podpora) a vyberte Vytvořit.
V okně konzoly Správce balíčků přejděte do kořenového adresáře projektu. Spuštěním následujícího příkazu nainstalujte ovladač .NET pro MongoDB:
Install-Package MongoDB.Driver
Přidání modelu entity
Přidejte adresář Models do kořenového adresáře projektu.
Book
Do adresáře Models přidejte třídu s následujícím kódem:using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace BookStoreApi.Models; public class Book { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } [BsonElement("Name")] public string BookName { get; set; } = null!; public decimal Price { get; set; } public string Category { get; set; } = null!; public string Author { get; set; } = null!; }
V předchozí třídě
Id
je vlastnost:- Vyžadováno pro mapování objektu CLR (Common Language Runtime) na kolekci MongoDB.
- Anotováno tak,
[BsonId]
aby tato vlastnost byla primárním klíčem dokumentu. - Anotace s povolením
[BsonRepresentation(BsonType.ObjectId)]
předání parametru jako typustring
místo objektové struktury. Mongo zpracovává převod zstring
naObjectId
.
Vlastnost
BookName
je opatřena poznámkami atributu[BsonElement]
. Hodnota atributuName
představuje název vlastnosti v kolekci MongoDB.
Přidání konfiguračního modelu
Přidejte následující hodnoty konfigurace databáze do
appsettings.json
:{ "BookStoreDatabase": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookStore", "BooksCollectionName": "Books" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
BookStoreDatabaseSettings
Do adresáře Models přidejte třídu s následujícím kódem:namespace BookStoreApi.Models; public class BookStoreDatabaseSettings { public string ConnectionString { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string BooksCollectionName { get; set; } = null!; }
Předchozí
BookStoreDatabaseSettings
třída se používá k uloženíappsettings.json
hodnot vlastností souboruBookStoreDatabase
. Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.Přidejte následující zvýrazněný kód do
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase"));
V předchozím kódu je instance konfigurace, na kterou
appsettings.json
se oddíl souboruBookStoreDatabase
sváže, zaregistrována v kontejneru Injektáž závislostí (DI). Například vlastnost objektuBookStoreDatabaseSettings
ConnectionString
je naplněnaBookStoreDatabase:ConnectionString
vlastností vappsettings.json
.Na začátek
Program.cs
BookStoreDatabaseSettings
odkazu přidejte následující kód:using BookStoreApi.Models;
Přidání služby operací CRUD
Přidejte adresář Služeb do kořenového adresáře projektu.
BooksService
Do adresáře Services přidejte třídu s následujícím kódem:using BookStoreApi.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace BookStoreApi.Services; public class BooksService { private readonly IMongoCollection<Book> _booksCollection; public BooksService( IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { var mongoClient = new MongoClient( bookStoreDatabaseSettings.Value.ConnectionString); var mongoDatabase = mongoClient.GetDatabase( bookStoreDatabaseSettings.Value.DatabaseName); _booksCollection = mongoDatabase.GetCollection<Book>( bookStoreDatabaseSettings.Value.BooksCollectionName); } public async Task<List<Book>> GetAsync() => await _booksCollection.Find(_ => true).ToListAsync(); public async Task<Book?> GetAsync(string id) => await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync(); public async Task CreateAsync(Book newBook) => await _booksCollection.InsertOneAsync(newBook); public async Task UpdateAsync(string id, Book updatedBook) => await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook); public async Task RemoveAsync(string id) => await _booksCollection.DeleteOneAsync(x => x.Id == id); }
V předchozím kódu
BookStoreDatabaseSettings
se instance načte z DI prostřednictvím injektáže konstruktoru. Tato technika poskytuje přístup kappsettings.json
hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .Přidejte následující zvýrazněný kód do
Program.cs
:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>();
V předchozím kódu
BooksService
je třída registrována v di kvůli podpoře injektáže konstruktoru ve spotřebě tříd. Životnost jednoúčelové služby je nejvhodnější, protožeBooksService
využívá přímou závislost naMongoClient
. V souladu s oficiálními pokynyMongoClient
pro opakované použití klienta Mongo by se měl zaregistrovat v DI s jednou životností služby.Na začátek
Program.cs
BooksService
odkazu přidejte následující kód:using BookStoreApi.Services;
Třída BooksService
používá následující MongoDB.Driver
členy ke spuštění operací CRUD s databází:
MongoClient: Načte instanci serveru pro spouštění databázových operací. Konstruktor této třídy je poskytován MongoDB připojovací řetězec:
public BooksService( IOptions<BookStoreDatabaseSettings> bookStoreDatabaseSettings) { var mongoClient = new MongoClient( bookStoreDatabaseSettings.Value.ConnectionString); var mongoDatabase = mongoClient.GetDatabase( bookStoreDatabaseSettings.Value.DatabaseName); _booksCollection = mongoDatabase.GetCollection<Book>( bookStoreDatabaseSettings.Value.BooksCollectionName); }
IMongoDatabase: Představuje databázi Mongo pro spuštěné operace. Tento kurz používá obecnou metodu GetCollection<TDocument>(collection) v rozhraní k získání přístupu k datům v konkrétní kolekci. Po volání této metody spusťte operace CRUD s kolekcí.
GetCollection<TDocument>(collection)
Volání metody:collection
představuje název kolekce.TDocument
představuje typ objektu CLR uložený v kolekci.
GetCollection<TDocument>(collection)
vrátí MongoCollection objekt představující kolekci. V tomto kurzu jsou v kolekci vyvolány následující metody:
- DeleteOneAsync: Odstraní jeden dokument odpovídající zadaným kritériím hledání.
- Najít<TDocument>: Vrátí všechny dokumenty v kolekci odpovídající zadaným kritériím hledání.
- InsertOneAsync: Vloží zadaný objekt jako nový dokument v kolekci.
- ReplaceOneAsync: Nahradí jeden dokument odpovídající zadaným kritériím hledání zadaným objektem.
Přidání kontroleru
BooksController
Přidejte třídu do adresáře Controllers s následujícím kódem:
using BookStoreApi.Models;
using BookStoreApi.Services;
using Microsoft.AspNetCore.Mvc;
namespace BookStoreApi.Controllers;
[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
private readonly BooksService _booksService;
public BooksController(BooksService booksService) =>
_booksService = booksService;
[HttpGet]
public async Task<List<Book>> Get() =>
await _booksService.GetAsync();
[HttpGet("{id:length(24)}")]
public async Task<ActionResult<Book>> Get(string id)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
return book;
}
[HttpPost]
public async Task<IActionResult> Post(Book newBook)
{
await _booksService.CreateAsync(newBook);
return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
}
[HttpPut("{id:length(24)}")]
public async Task<IActionResult> Update(string id, Book updatedBook)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
updatedBook.Id = book.Id;
await _booksService.UpdateAsync(id, updatedBook);
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public async Task<IActionResult> Delete(string id)
{
var book = await _booksService.GetAsync(id);
if (book is null)
{
return NotFound();
}
await _booksService.RemoveAsync(id);
return NoContent();
}
}
Předchozí kontroler webového rozhraní API:
BooksService
Používá třídu ke spuštění operací CRUD.- Obsahuje metody akcí pro podporu požadavků GET, POST, PUT a DELETE HTTP.
- Volání CreatedAtAction v
Create
metodě akce k vrácení odpovědi HTTP 201 Stavový kód 201 je standardní odpověď pro metodu HTTP POST, která na serveru vytvoří nový prostředek.CreatedAtAction
také přidá hlavičkuLocation
do odpovědi. HlavičkaLocation
určuje identifikátor URI nově vytvořené knihy.
Testování webového rozhraní API
Sestavte a spusťte aplikaci.
Přejděte do
https://localhost:<port>/api/books
umístění , kde<port>
je automaticky přiřazené číslo portu aplikace a otestujte metodu akce bezGet
parametrů kontroleru. Zobrazí se odpověď JSON podobná následující:[ { "id": "61a6058e6c43f32854e51f51", "bookName": "Design Patterns", "price": 54.93, "category": "Computers", "author": "Ralph Johnson" }, { "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" } ]
Přejděte k
https://localhost:<port>/api/books/{id here}
otestování přetíženéGet
metody akce kontroleru. Zobrazí se odpověď JSON podobná následující:{ "id": "61a6058e6c43f32854e51f52", "bookName": "Clean Code", "price": 43.15, "category": "Computers", "author": "Robert C. Martin" }
Konfigurace možností serializace JSON
V části Test webového rozhraní API je potřeba změnit dvě podrobnosti o odpovědích JSON:
- Výchozí velikost písmen velbloudího jména vlastností by se měla změnit tak, aby odpovídala písmenům pascalu názvů vlastností objektu CLR.
- Vlastnost
bookName
by měla být vrácena jakoName
.
Pokud chcete splnit předchozí požadavky, proveďte následující změny:
V
Program.cs
zřetězte následující zvýrazněný kód voláníAddControllers
metody:var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure<BookStoreDatabaseSettings>( builder.Configuration.GetSection("BookStoreDatabase")); builder.Services.AddSingleton<BooksService>(); builder.Services.AddControllers() .AddJsonOptions( options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
Při předchozí změně se názvy vlastností v serializované odpovědi JSON webového rozhraní API shodují s odpovídajícími názvy vlastností v typu objektu CLR.
Book
Například vlastnost třídyAuthor
serializuje jakoAuthor
místoauthor
.V
Models/Book.cs
, anotaceBookName
vlastnost s atributem[JsonPropertyName]
:[BsonElement("Name")] [JsonPropertyName("Name")] public string BookName { get; set; } = null!;
Hodnota
[JsonPropertyName]
atributuName
představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.Na začátek
Models/Book.cs
překladu odkazu na[JsonProperty]
atribut přidejte následující kód:using System.Text.Json.Serialization;
Opakujte kroky definované v části Test webového rozhraní API . Všimněte si rozdílu v názvech vlastností JSON.
Přidání podpory ověřování do webového rozhraní API
ASP.NET Core Identity přidává do webových aplikací ASP.NET Core funkce přihlášení uživatelského rozhraní. K zabezpečení webových rozhraní API a spA použijte jednu z následujících možností:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server je architektura OpenID Connect a OAuth 2.0 pro ASP.NET Core. Duende Identity Server umožňuje následující funkce zabezpečení:
- Ověřování jako služba (AaaS)
- Jednotné přihlašování nebo vypnutí (SSO) u více typů aplikací
- Řízení přístupu pro rozhraní API
- Federační brána
Důležité
Duende Software může vyžadovat, abyste zaplatili licenční poplatek za produkční využití serveru Duende Identity Server. Další informace najdete v tématu Migrace z ASP.NET Core 5.0 na verzi 6.0.
Další informace najdete v dokumentaci k Duende Identity Serveru (web Duende Software).
Další materiály
Tento kurz vytvoří webové rozhraní API, na kterém běží operace Create, Read, Update a Delete (CRUD) v databázi MongoDB NoSQL.
V tomto kurzu se naučíte:
- Konfigurace MongoDB
- Vytvoření databáze MongoDB
- Definování kolekce a schématu MongoDB
- Provádění operací CRUD MongoDB z webového rozhraní API
- Přizpůsobení serializace JSON
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Požadavky
- .NET Core SDK 3.0 nebo novější
- Visual Studio 2019 s úlohou vývoje pro ASP.NET a web
- MongoDB
Konfigurace MongoDB
Pokud používáte Windows, ve výchozím nastavení se MongoDB instaluje ve složce C:\Program Files\MongoDB . Do proměnné prostředí přidejte C:\Program Files\MongoDB\Server\<version_number>\binPath
. Tato změna umožňuje přístup k MongoDB odkudkoli na vývojovém počítači.
Pomocí prostředí Mongo Shell v následujících krocích vytvořte databázi, vytvořte kolekce a ukládejte dokumenty. Další informace o příkazech prostředí Mongo Shell najdete v tématu Práce s prostředím Mongo Shell.
Zvolte adresář na vývojovém počítači pro ukládání dat. Například C:\BooksData ve Windows. Pokud adresář neexistuje, vytvořte ho. Prostředí Mongo Shell nevytvoří nové adresáře.
Otevřete příkazové prostředí. Spuštěním následujícího příkazu se připojte k MongoDB na výchozím portu 27017. Nezapomeňte nahradit
<data_directory_path>
adresářem, který jste zvolili v předchozím kroku.mongod --dbpath <data_directory_path>
Otevřete další instanci příkazového prostředí. Spuštěním následujícího příkazu se připojte k výchozí testovací databázi:
mongo
V příkazovém prostředí spusťte následující příkaz:
use BookstoreDb
Databáze s názvem BookstoreDb se vytvoří, pokud ještě neexistuje. Pokud databáze existuje, otevře se její připojení pro transakce.
Vytvořte kolekci
Books
pomocí následujícího příkazu:db.createCollection('Books')
Zobrazí se následující výsledek:
{ "ok" : 1 }
Pomocí následujícího příkazu definujte schéma kolekce
Books
a vložte dva dokumenty:db.Books.insertMany([{'Name':'Design Patterns','Price':54.93,'Category':'Computers','Author':'Ralph Johnson'}, {'Name':'Clean Code','Price':43.15,'Category':'Computers','Author':'Robert C. Martin'}])
Zobrazí se následující výsledek:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bfd996f7b8e48dc15ff215d"), ObjectId("5bfd996f7b8e48dc15ff215e") ] }
Poznámka:
ID uvedené v tomto článku se při spuštění této ukázky neshoduje s ID.
K zobrazení dokumentů v databázi použijte následující příkaz:
db.Books.find({}).pretty()
Zobrazí se následující výsledek:
{ "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"), "Name" : "Design Patterns", "Price" : 54.93, "Category" : "Computers", "Author" : "Ralph Johnson" } { "_id" : ObjectId("5bfd996f7b8e48dc15ff215e"), "Name" : "Clean Code", "Price" : 43.15, "Category" : "Computers", "Author" : "Robert C. Martin" }
Schéma přidá automaticky vygenerovanou
_id
vlastnost typuObjectId
pro každý dokument.
Databáze je připravená. Můžete začít vytvářet webové rozhraní API ASP.NET Core.
Vytvoření projektu webového rozhraní API ASP.NET Core
Přejděte na Soubor>nový>projekt.
Vyberte typ projektu ASP.NET Základní webová aplikace a vyberte Další.
Pojmenujte projekt BooksApi a vyberte Vytvořit.
Vyberte cílovou architekturu .NET Core a ASP.NET Core 3.0. Vyberte šablonu projektu rozhraní API a vyberte Vytvořit.
Navštivte galerii NuGet: MongoDB.Driver a zjistěte nejnovější stabilní verzi ovladače .NET pro MongoDB. V okně konzoly Správce balíčků přejděte do kořenového adresáře projektu. Spuštěním následujícího příkazu nainstalujte ovladač .NET pro MongoDB:
Install-Package MongoDB.Driver -Version {VERSION}
Přidání modelu entity
Přidejte adresář Models do kořenového adresáře projektu.
Book
Do adresáře Models přidejte třídu s následujícím kódem:using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace BooksApi.Models { public class Book { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } [BsonElement("Name")] public string BookName { get; set; } public decimal Price { get; set; } public string Category { get; set; } public string Author { get; set; } } }
V předchozí třídě
Id
je vlastnost:- Vyžadováno pro mapování objektu CLR (Common Language Runtime) na kolekci MongoDB.
- Anotováno tak,
[BsonId]
aby tato vlastnost byla primárním klíčem dokumentu. - Anotace s povolením
[BsonRepresentation(BsonType.ObjectId)]
předání parametru jako typustring
místo objektové struktury. Mongo zpracovává převod zstring
naObjectId
.
Vlastnost
BookName
je opatřena poznámkami atributu[BsonElement]
. Hodnota atributuName
představuje název vlastnosti v kolekci MongoDB.
Přidání konfiguračního modelu
Přidejte následující hodnoty konfigurace databáze do
appsettings.json
:{ "BookstoreDatabaseSettings": { "BooksCollectionName": "Books", "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "BookstoreDb" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } } }
BookstoreDatabaseSettings.cs
Do adresáře Models přidejte soubor s následujícím kódem:namespace BooksApi.Models { public class BookstoreDatabaseSettings : IBookstoreDatabaseSettings { public string BooksCollectionName { get; set; } public string ConnectionString { get; set; } public string DatabaseName { get; set; } } public interface IBookstoreDatabaseSettings { string BooksCollectionName { get; set; } string ConnectionString { get; set; } string DatabaseName { get; set; } } }
Předchozí
BookstoreDatabaseSettings
třída se používá k uloženíappsettings.json
hodnot vlastností souboruBookstoreDatabaseSettings
. Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.Přidejte následující zvýrazněný kód do
Startup.ConfigureServices
:public void ConfigureServices(IServiceCollection services) { // requires using Microsoft.Extensions.Options services.Configure<BookstoreDatabaseSettings>( Configuration.GetSection(nameof(BookstoreDatabaseSettings))); services.AddSingleton<IBookstoreDatabaseSettings>(sp => sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value); services.AddControllers(); }
V předchozím kódu:
- Instance konfigurace, na kterou
appsettings.json
se oddíl souboruBookstoreDatabaseSettings
sváže, je zaregistrována v kontejneru injektáže závislostí (DI). Například vlastnost objektuBookstoreDatabaseSettings
ConnectionString
je naplněnaBookstoreDatabaseSettings:ConnectionString
vlastností vappsettings.json
. - Rozhraní
IBookstoreDatabaseSettings
je registrováno v DI s životností jednoúčelové služby. Při vložení se instance rozhraní přeloží naBookstoreDatabaseSettings
objekt.
- Instance konfigurace, na kterou
Na začátek
Startup.cs
překladuBookstoreDatabaseSettings
aIBookstoreDatabaseSettings
odkazů přidejte následující kód:using BooksApi.Models;
Přidání služby operací CRUD
Přidejte adresář Služeb do kořenového adresáře projektu.
BookService
Do adresáře Services přidejte třídu s následujícím kódem:using BooksApi.Models; using MongoDB.Driver; using System.Collections.Generic; using System.Linq; namespace BooksApi.Services { public class BookService { private readonly IMongoCollection<Book> _books; public BookService(IBookstoreDatabaseSettings settings) { var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); _books = database.GetCollection<Book>(settings.BooksCollectionName); } public List<Book> Get() => _books.Find(book => true).ToList(); public Book Get(string id) => _books.Find<Book>(book => book.Id == id).FirstOrDefault(); public Book Create(Book book) { _books.InsertOne(book); return book; } public void Update(string id, Book bookIn) => _books.ReplaceOne(book => book.Id == id, bookIn); public void Remove(Book bookIn) => _books.DeleteOne(book => book.Id == bookIn.Id); public void Remove(string id) => _books.DeleteOne(book => book.Id == id); } }
V předchozím kódu
IBookstoreDatabaseSettings
se instance načte z DI prostřednictvím injektáže konstruktoru. Tato technika poskytuje přístup kappsettings.json
hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .Přidejte následující zvýrazněný kód do
Startup.ConfigureServices
:public void ConfigureServices(IServiceCollection services) { services.Configure<BookstoreDatabaseSettings>( Configuration.GetSection(nameof(BookstoreDatabaseSettings))); services.AddSingleton<IBookstoreDatabaseSettings>(sp => sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value); services.AddSingleton<BookService>(); services.AddControllers(); }
V předchozím kódu
BookService
je třída registrována v di kvůli podpoře injektáže konstruktoru ve spotřebě tříd. Životnost jednoúčelové služby je nejvhodnější, protožeBookService
využívá přímou závislost naMongoClient
. V souladu s oficiálními pokynyMongoClient
pro opakované použití klienta Mongo by se měl zaregistrovat v DI s jednou životností služby.Na začátek
Startup.cs
BookService
odkazu přidejte následující kód:using BooksApi.Services;
Třída BookService
používá následující MongoDB.Driver
členy ke spuštění operací CRUD s databází:
MongoClient: Načte instanci serveru pro spouštění databázových operací. Konstruktor této třídy je poskytován MongoDB připojovací řetězec:
public BookService(IBookstoreDatabaseSettings settings) { var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); _books = database.GetCollection<Book>(settings.BooksCollectionName); }
IMongoDatabase: Představuje databázi Mongo pro spuštěné operace. Tento kurz používá obecnou metodu GetCollection<TDocument>(collection) v rozhraní k získání přístupu k datům v konkrétní kolekci. Po volání této metody spusťte operace CRUD s kolekcí.
GetCollection<TDocument>(collection)
Volání metody:collection
představuje název kolekce.TDocument
představuje typ objektu CLR uložený v kolekci.
GetCollection<TDocument>(collection)
vrátí MongoCollection objekt představující kolekci. V tomto kurzu jsou v kolekci vyvolány následující metody:
- DeleteOne: Odstraní jeden dokument odpovídající zadaným kritériím hledání.
- Najít<TDocument>: Vrátí všechny dokumenty v kolekci odpovídající zadaným kritériím hledání.
- InsertOne: Vloží zadaný objekt jako nový dokument v kolekci.
- ReplaceOne: Nahradí jeden dokument odpovídající zadaným kritériím hledání zadaným objektem.
Přidání kontroleru
BooksController
Přidejte třídu do adresáře Controllers s následujícím kódem:
using BooksApi.Models;
using BooksApi.Services;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace BooksApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
private readonly BookService _bookService;
public BooksController(BookService bookService)
{
_bookService = bookService;
}
[HttpGet]
public ActionResult<List<Book>> Get() =>
_bookService.Get();
[HttpGet("{id:length(24)}", Name = "GetBook")]
public ActionResult<Book> Get(string id)
{
var book = _bookService.Get(id);
if (book == null)
{
return NotFound();
}
return book;
}
[HttpPost]
public ActionResult<Book> Create(Book book)
{
_bookService.Create(book);
return CreatedAtRoute("GetBook", new { id = book.Id.ToString() }, book);
}
[HttpPut("{id:length(24)}")]
public IActionResult Update(string id, Book bookIn)
{
var book = _bookService.Get(id);
if (book == null)
{
return NotFound();
}
_bookService.Update(id, bookIn);
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public IActionResult Delete(string id)
{
var book = _bookService.Get(id);
if (book == null)
{
return NotFound();
}
_bookService.Remove(id);
return NoContent();
}
}
}
Předchozí kontroler webového rozhraní API:
BookService
Používá třídu ke spuštění operací CRUD.- Obsahuje metody akcí pro podporu požadavků GET, POST, PUT a DELETE HTTP.
- Volání CreatedAtRoute v
Create
metodě akce k vrácení odpovědi HTTP 201 Stavový kód 201 je standardní odpověď pro metodu HTTP POST, která na serveru vytvoří nový prostředek.CreatedAtRoute
také přidá hlavičkuLocation
do odpovědi. HlavičkaLocation
určuje identifikátor URI nově vytvořené knihy.
Testování webového rozhraní API
Sestavte a spusťte aplikaci.
Přejděte k
https://localhost:<port>/api/books
otestování metody akce bezGet
parametrů kontroleru. Zobrazí se následující odpověď JSON:[ { "id":"5bfd996f7b8e48dc15ff215d", "bookName":"Design Patterns", "price":54.93, "category":"Computers", "author":"Ralph Johnson" }, { "id":"5bfd996f7b8e48dc15ff215e", "bookName":"Clean Code", "price":43.15, "category":"Computers", "author":"Robert C. Martin" } ]
Přejděte k
https://localhost:<port>/api/books/{id here}
otestování přetíženéGet
metody akce kontroleru. Zobrazí se následující odpověď JSON:{ "id":"{ID}", "bookName":"Clean Code", "price":43.15, "category":"Computers", "author":"Robert C. Martin" }
Konfigurace možností serializace JSON
V části Test webového rozhraní API je potřeba změnit dvě podrobnosti o odpovědích JSON:
- Výchozí velikost písmen velbloudího jména vlastností by se měla změnit tak, aby odpovídala písmenům pascalu názvů vlastností objektu CLR.
- Vlastnost
bookName
by měla být vrácena jakoName
.
Pokud chcete splnit předchozí požadavky, proveďte následující změny:
Json.NET byla odebrána ze sdílené architektury ASP.NET. Přidejte odkaz na balíček .
Microsoft.AspNetCore.Mvc.NewtonsoftJson
V
Startup.ConfigureServices
zřetězte následující zvýrazněný kód voláníAddControllers
metody:public void ConfigureServices(IServiceCollection services) { services.Configure<BookstoreDatabaseSettings>( Configuration.GetSection(nameof(BookstoreDatabaseSettings))); services.AddSingleton<IBookstoreDatabaseSettings>(sp => sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value); services.AddSingleton<BookService>(); services.AddControllers() .AddNewtonsoftJson(options => options.UseMemberCasing()); }
Při předchozí změně se názvy vlastností v serializované odpovědi JSON webového rozhraní API shodují s odpovídajícími názvy vlastností v typu objektu CLR. Například
Book
vlastnost třídyAuthor
serializuje jakoAuthor
.V
Models/Book.cs
, anotaceBookName
vlastnost s následujícím[JsonProperty]
atributem:[BsonElement("Name")] [JsonProperty("Name")] public string BookName { get; set; }
Hodnota
[JsonProperty]
atributuName
představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.Na začátek
Models/Book.cs
překladu odkazu na[JsonProperty]
atribut přidejte následující kód:using Newtonsoft.Json;
Opakujte kroky definované v části Test webového rozhraní API . Všimněte si rozdílu v názvech vlastností JSON.
Přidání podpory ověřování do webového rozhraní API
ASP.NET Core Identity přidává do webových aplikací ASP.NET Core funkce přihlášení uživatelského rozhraní. K zabezpečení webových rozhraní API a spA použijte jednu z následujících možností:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende IdentityServer. Duende IdentityServer je produkt třetí strany.
Duende IdentityServer je architektura OpenID Connect a OAuth 2.0 pro ASP.NET Core. Duende IdentityServer umožňuje následující funkce zabezpečení:
- Ověřování jako služba (AaaS)
- Jednotné přihlašování nebo vypnutí (SSO) u více typů aplikací
- Řízení přístupu pro rozhraní API
- Federační brána
Další informace najdete v tématu Přehled duende IdentityServer.
Další informace o jiných poskytovatelích ověřování najdete v tématu Možnosti ověřování OSS komunity pro ASP.NET Core.
Další kroky
Další informace o vytváření webových rozhraní API pro ASP.NET Core najdete v následujících zdrojích informací: