Sdílet prostřednictvím


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

Konfigurace MongoDB

Povolení přístupu k Prostředí MongoDB a MongoDB odkudkoli na vývojovém počítači (Windows/Linux/macOS):

  1. 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í.
  2. 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>\binPATH.
  3. 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: .
  4. 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.

  1. Spuštěním příkazu mongosh.exeotevřete instanci příkazového prostředí MongoDB .

  2. 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
    
  3. 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.

  4. Vytvořte kolekci Books pomocí následujícího příkazu:

    db.createCollection('Books')
    

    Zobrazí se následující výsledek:

    { "ok" : 1 }
    
  5. 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é ObjectIdv předchozím výsledku se neshodují s těmi, které se zobrazují v příkazovém prostředí.

  6. 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 typu ObjectId pro každý dokument.

Vytvoření projektu webového rozhraní API ASP.NET Core

  1. Přejděte na Soubor>nový>projekt.

  2. Vyberte typ projektu základního webového rozhraní API ASP.NET a vyberte Další.

  3. Pojmenujte projekt BookStoreApi a vyberte Další.

  4. Vyberte architekturu .NET 8.0 (dlouhodobá podpora) a vyberte Vytvořit.

  5. 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

  1. Přidejte adresář Models do kořenového adresáře projektu.

  2. 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 typu string místo objektové struktury. Mongo zpracovává převod z string na ObjectId.

    Vlastnost BookName je opatřena poznámkami atributu [BsonElement] . Hodnota atributu Name představuje název vlastnosti v kolekci MongoDB.

Přidání konfiguračního modelu

  1. 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": "*"
    }
    
  2. 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í souboru BookStoreDatabase . Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.

  3. 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 souboru BookStoreDatabase sváže, zaregistrována v kontejneru Injektáž závislostí (DI). Například vlastnost objektu BookStoreDatabaseSettings ConnectionString je naplněna BookStoreDatabase:ConnectionString vlastností v appsettings.json.

  4. Na začátek Program.cs BookStoreDatabaseSettings odkazu přidejte následující kód:

    using BookStoreApi.Models;
    

Přidání služby operací CRUD

  1. Přidejte adresář Služeb do kořenového adresáře projektu.

  2. 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 k appsettings.json hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .

  3. 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že BooksService využívá přímou závislost na MongoClient. 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.

  4. 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čku Location do odpovědi. Hlavička Location určuje identifikátor URI nově vytvořené knihy.

Testování webového rozhraní API

  1. Sestavte a spusťte aplikaci.

  2. Přejděte do https://localhost:<port>/api/booksumístění , kde <port> je automaticky přiřazené číslo portu aplikace, a otestujte metodu akce bez Get 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"
      }
    ]
    
  3. 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 jako Name.

Pokud chcete splnit předchozí požadavky, proveďte následující změny:

  1. V Program.cszř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řídy Author serializuje jako Author místo author.

  2. V Models/Book.cs, anotace BookName vlastnost s atributem [JsonPropertyName] :

    [BsonElement("Name")]
    [JsonPropertyName("Name")]
    public string BookName { get; set; } = null!;
    

    Hodnota [JsonPropertyName] atributu Name představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.

  3. Na začátek Models/Book.cs překladu odkazu na [JsonProperty] atribut přidejte následující kód:

    using System.Text.Json.Serialization;
    
  4. 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í:

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

Konfigurace MongoDB

Povolte přístup k Prostředí MongoDB a Mongo DB odkudkoli na vývojovém počítači:

  1. 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>\binPATH.

  2. 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í.

  3. 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.

  4. 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.

  1. Spuštěním příkazu mongosh.exeotevřete instanci příkazového prostředí MongoDB .

  2. 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
    
  3. 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.

  4. Vytvořte kolekci Books pomocí následujícího příkazu:

    db.createCollection('Books')
    

    Zobrazí se následující výsledek:

    { "ok" : 1 }
    
  5. 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é ObjectIdv předchozím výsledku se neshodují s těmi, které se zobrazují v příkazovém prostředí.

  6. 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 typu ObjectId pro každý dokument.

Vytvoření projektu webového rozhraní API ASP.NET Core

  1. Přejděte na Soubor>nový>projekt.

  2. Vyberte typ projektu základního webového rozhraní API ASP.NET a vyberte Další.

  3. Pojmenujte projekt BookStoreApi a vyberte Další.

  4. Vyberte architekturu .NET 7.0 (Standardní podpora termínů) a vyberte Vytvořit.

  5. V nabídce Nástroje vyberte Správce balíčků> NuGet Správce balíčků Konzola.

  6. 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

  1. Přidejte adresář Models do kořenového adresáře projektu.

  2. 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 typu string místo objektové struktury. Mongo zpracovává převod z string na ObjectId.

    Vlastnost BookName je opatřena poznámkami atributu [BsonElement] . Hodnota atributu Name představuje název vlastnosti v kolekci MongoDB.

Přidání konfiguračního modelu

  1. 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": "*"
    }
    
  2. 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í souboru BookStoreDatabase . Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.

  3. 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 souboru BookStoreDatabase sváže, zaregistrována v kontejneru Injektáž závislostí (DI). Například vlastnost objektu BookStoreDatabaseSettings ConnectionString je naplněna BookStoreDatabase:ConnectionString vlastností v appsettings.json.

  4. Na začátek Program.cs BookStoreDatabaseSettings odkazu přidejte následující kód:

    using BookStoreApi.Models;
    

Přidání služby operací CRUD

  1. Přidejte adresář Služeb do kořenového adresáře projektu.

  2. 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 k appsettings.json hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .

  3. 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že BooksService využívá přímou závislost na MongoClient. 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.

  4. 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čku Location do odpovědi. Hlavička Location určuje identifikátor URI nově vytvořené knihy.

Testování webového rozhraní API

  1. Sestavte a spusťte aplikaci.

  2. Přejděte do https://localhost:<port>/api/booksumístění , kde <port> je automaticky přiřazené číslo portu aplikace a otestujte metodu akce bez Get 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"
      }
    ]
    
  3. 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 jako Name.

Pokud chcete splnit předchozí požadavky, proveďte následující změny:

  1. V Program.cszř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řídy Author serializuje jako Author místo author.

  2. V Models/Book.cs, anotace BookName vlastnost s atributem [JsonPropertyName] :

    [BsonElement("Name")]
    [JsonPropertyName("Name")]
    public string BookName { get; set; } = null!;
    

    Hodnota [JsonPropertyName] atributu Name představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.

  3. Na začátek Models/Book.cs překladu odkazu na [JsonProperty] atribut přidejte následující kód:

    using System.Text.Json.Serialization;
    
  4. 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í:

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

Konfigurace MongoDB

Povolte přístup k Prostředí MongoDB a Mongo DB odkudkoli na vývojovém počítači:

  1. 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>\binPATH.

  2. 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í.

  3. 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.

  4. 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.

  1. Spuštěním příkazu mongosh.exeotevřete instanci příkazového prostředí MongoDB .

  2. 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
    
  3. 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.

  4. Vytvořte kolekci Books pomocí následujícího příkazu:

    db.createCollection('Books')
    

    Zobrazí se následující výsledek:

    { "ok" : 1 }
    
  5. 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é ObjectIdv předchozím výsledku se neshodují s těmi, které se zobrazují v příkazovém prostředí.

  6. 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 typu ObjectId pro každý dokument.

Vytvoření projektu webového rozhraní API ASP.NET Core

  1. Přejděte na Soubor>nový>projekt.

  2. Vyberte typ projektu základního webového rozhraní API ASP.NET a vyberte Další.

  3. Pojmenujte projekt BookStoreApi a vyberte Další.

  4. Vyberte architekturu .NET 6.0 (dlouhodobá podpora) a vyberte Vytvořit.

  5. 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

  1. Přidejte adresář Models do kořenového adresáře projektu.

  2. 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 typu string místo objektové struktury. Mongo zpracovává převod z string na ObjectId.

    Vlastnost BookName je opatřena poznámkami atributu [BsonElement] . Hodnota atributu Name představuje název vlastnosti v kolekci MongoDB.

Přidání konfiguračního modelu

  1. 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": "*"
    }
    
  2. 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í souboru BookStoreDatabase . Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.

  3. 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 souboru BookStoreDatabase sváže, zaregistrována v kontejneru Injektáž závislostí (DI). Například vlastnost objektu BookStoreDatabaseSettings ConnectionString je naplněna BookStoreDatabase:ConnectionString vlastností v appsettings.json.

  4. Na začátek Program.cs BookStoreDatabaseSettings odkazu přidejte následující kód:

    using BookStoreApi.Models;
    

Přidání služby operací CRUD

  1. Přidejte adresář Služeb do kořenového adresáře projektu.

  2. 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 k appsettings.json hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .

  3. 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že BooksService využívá přímou závislost na MongoClient. 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.

  4. 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čku Location do odpovědi. Hlavička Location určuje identifikátor URI nově vytvořené knihy.

Testování webového rozhraní API

  1. Sestavte a spusťte aplikaci.

  2. Přejděte do https://localhost:<port>/api/booksumístění , kde <port> je automaticky přiřazené číslo portu aplikace a otestujte metodu akce bez Get 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"
      }
    ]
    
  3. 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 jako Name.

Pokud chcete splnit předchozí požadavky, proveďte následující změny:

  1. V Program.cszř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řídy Author serializuje jako Author místo author.

  2. V Models/Book.cs, anotace BookName vlastnost s atributem [JsonPropertyName] :

    [BsonElement("Name")]
    [JsonPropertyName("Name")]
    public string BookName { get; set; } = null!;
    

    Hodnota [JsonPropertyName] atributu Name představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.

  3. Na začátek Models/Book.cs překladu odkazu na [JsonProperty] atribut přidejte následující kód:

    using System.Text.Json.Serialization;
    
  4. 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í:

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

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.

  1. 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.

  2. 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>
    
  3. 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
    
  4. 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.

  5. Vytvořte kolekci Books pomocí následujícího příkazu:

    db.createCollection('Books')
    

    Zobrazí se následující výsledek:

    { "ok" : 1 }
    
  6. 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.

  7. 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 typu ObjectId 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

  1. Přejděte na Soubor>nový>projekt.

  2. Vyberte typ projektu ASP.NET Základní webová aplikace a vyberte Další.

  3. Pojmenujte projekt BooksApi a vyberte Vytvořit.

  4. Vyberte cílovou architekturu .NET Core a ASP.NET Core 3.0. Vyberte šablonu projektu rozhraní API a vyberte Vytvořit.

  5. 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

  1. Přidejte adresář Models do kořenového adresáře projektu.

  2. 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 typu string místo objektové struktury. Mongo zpracovává převod z string na ObjectId.

    Vlastnost BookName je opatřena poznámkami atributu [BsonElement] . Hodnota atributu Name představuje název vlastnosti v kolekci MongoDB.

Přidání konfiguračního modelu

  1. 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"
          }
        }
      }
    }
    
  2. 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í souboru BookstoreDatabaseSettings . Názvy vlastností JSON a C# jsou pojmenované stejně, aby se usnadnil proces mapování.

  3. 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 souboru BookstoreDatabaseSettings sváže, je zaregistrována v kontejneru injektáže závislostí (DI). Například vlastnost objektu BookstoreDatabaseSettings ConnectionString je naplněna BookstoreDatabaseSettings:ConnectionString vlastností v appsettings.json.
    • Rozhraní IBookstoreDatabaseSettings je registrováno v DI s životností jednoúčelové služby. Při vložení se instance rozhraní přeloží na BookstoreDatabaseSettings objekt.
  4. Na začátek Startup.cs překladu BookstoreDatabaseSettings a IBookstoreDatabaseSettings odkazů přidejte následující kód:

    using BooksApi.Models;
    

Přidání služby operací CRUD

  1. Přidejte adresář Služeb do kořenového adresáře projektu.

  2. 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 k appsettings.json hodnotám konfigurace, které byly přidány v části Přidat konfigurační model .

  3. 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že BookService využívá přímou závislost na MongoClient. 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.

  4. 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čku Location do odpovědi. Hlavička Location určuje identifikátor URI nově vytvořené knihy.

Testování webového rozhraní API

  1. Sestavte a spusťte aplikaci.

  2. Přejděte k https://localhost:<port>/api/books otestování metody akce bez Get 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"
      }
    ]
    
  3. 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 jako Name.

Pokud chcete splnit předchozí požadavky, proveďte následující změny:

  1. Json.NET byla odebrána ze sdílené architektury ASP.NET. Přidejte odkaz na balíček .Microsoft.AspNetCore.Mvc.NewtonsoftJson

  2. V Startup.ConfigureServiceszř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řídy Author serializuje jako Author.

  3. V Models/Book.cs, anotace BookName vlastnost s následujícím [JsonProperty] atributem:

    [BsonElement("Name")]
    [JsonProperty("Name")]
    public string BookName { get; set; }
    

    Hodnota [JsonProperty] atributu Name představuje název vlastnosti v serializované odpovědi JSON webového rozhraní API.

  4. Na začátek Models/Book.cs překladu odkazu na [JsonProperty] atribut přidejte následující kód:

    using Newtonsoft.Json;
    
  5. 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í:

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í: