Fermer

novembre 19, 2021

ASP.NET Core pour les débutants : API Web


Si vous travaillez avec la plate-forme .NET ou si vous débutez dans ce domaine, vous devez connaître les API Web, des applications robustes et sécurisées qui utilisent le protocole HTTP pour communiquer entre les serveurs et les clients et qui sont très demandées sur le marché. .

Qu'est-ce qu'une API Web ?

Opération de base de l'API

Les interfaces de programmation d'applications (API) sont essentiellement des services HTTP qui sont utilisés pour communiquer entre les applications de manière simple et centralisée.

Microsoft via le framework ASP.NET fournit des moyens de créer des API Web accessibles à partir de n'importe quel client, tels que des navigateurs, des applications de bureau et des appareils mobiles.

L'API Web ASP.NET peut être utilisée pour créer des services REST et SOAP.

Voici quelques avantages de travailler avec une API Web ASP.NET :

  • Cela fonctionne de la même manière que HTTP, en utilisant des verbes HTTP standard tels que GET, POST, PUT, DELETE pour toutes les opérations CRUD.
  • Prise en charge complète du routage.[19659009] La réponse est générée au format JSON et XML usi ng MediaTypeFormatter.
  • Il peut être hébergé sur IIS ainsi qu'auto-hébergé en dehors d'IIS.
  • Prend en charge la liaison et la validation de modèles.
  • Prend en charge les modèles d'URL et les méthodes HTTP.
  • Il a une forme simple de injection de dépendance.
  • Peut être versionné.

Comment fonctionnent les API Web ASP.NET ?

Une API Web ASP.NET Core se compose essentiellement d'une ou plusieurs classes de contrôleur qui dérivent de ControllerBase. La classe ControllerBase fournit de nombreuses méthodes et propriétés utiles pour travailler avec les requêtes HTTP.

Organigramme de l'API Web ASP.NET Core

Comme vous pouvez le voir dans l'image ci-dessus, un "client" fait une « requête HTTP » à l'API, qui, via le « contrôleur », identifie l'appel et effectue la lecture ou l'écriture dans la « couche d'accès aux données ». Le « Modèle » est renvoyé, dans ce cas, un objet JSON « Contact : Nom » dans la « réponse HTTP ». En termes simples, l'API relie le « client » et les « données » d'une manière simple et sûre.

Exemple de réponse API console

Réponse API[19659005]Maintenant que nous avons vu les bases des API Web, créons une API et voyons en pratique comment elle fonctionne.

Création d'une API Web ASP.NET Core 5

Pour créer une API Web ASP.NET Core 5 application, nous utiliserons :

  • .NET SDK : Le .NET SDK est une boîte à outils pour les développeurs dont vous aurez besoin pour commencer à développer sur la plate-forme .NET. Vous pouvez télécharger la version 👉 ici (le .NET 5.0 est recommandé car il contient déjà les versions antérieures).

  • Visual Studio 2019 : Vous pouvez télécharger la version communautaire ici—c'est gratuit 😊 et contient toutes les fonctionnalités dont vous avez besoin pour créer, tester et déployer une application API Web.[19659027]👉 Vous pouvez télécharger le code source du projet ici.

    Ci-dessous nous aurons quelques étapes pour construire notre application :

    1. Ouvrez Visual Studio 2019 → Cliquez sur « Créer un nouveau projet. »

    2. Choisissez l'option « ASP.NET Core Web API. » Cliquez sur « Suivant ».

    3. Écrivez le nom du projet (ma suggestion est "MyReadingList.WebAPI") et le dossier du nom de la solution (ma suggestion est "MyReadingList"), puis cliquez sur "Suivant".

    4. Dans le « Target Framework », choisissez « .NET 5.0 » et cliquez sur « Créer ».

    Par défaut, notre API nouvellement créée est livrée avec les bases pour l'exécuter, avec un exemple de contrôleur. Si vous cliquez sur « IIS Express » ou appuyez sur la touche « F5 » de votre clavier, l'application démarre et est accessible via l'URL :

    
    https://localhost:44345/swagger/index.html
    
    

    Le GIF ci-dessous montre l'exécution de la procédure.

    Créer la première API Web ASPNET

    Lorsque nous avons créé notre API, il y avait déjà un exemple appelé « WeatherForecast » que vous venez d'exécuter, mais ne perdons pas de temps avec ça, nous allons créer notre propre exemple d'API : une liste de lecture, puis nous ajouterons nos livres préférés. 📚📖📗

    Tout d'abord, créons notre classe de modèle « Livre », qui est une classe qui représente une entité « Livre ». Pour ce faire, cliquez avec le bouton droit sur le projet et ajoutez un dossier appelé « Modèles », puis dans Modèles, créez une classe appelée « Livre ».

    public class Book
    {
      public  ID de guidage { get; set; }
      public string Nom { get[19659045]; set; }
      public string Auteur { get; set;  }
      public string Genre { get; set; }
      public bool Lire { get; set; }
    }
    

    Création d'un contexte de base de données

    La classe de contexte est responsable de l'interaction avec les objets de données. Il gère les objets d'entité pendant l'exécution, ce qui inclut le remplissage des valeurs d'objet avec des données provenant d'une base de données, le suivi des modifications apportées et la persistance des données dans notre base de données.

    Une façon de travailler avec le paradigme du « contexte » consiste à définir une classe qui dérive de DbContext et expose la classe de modèle en tant que propriété de DbSet.

    Entity Framework nous permet d'interroger, d'insérer, de mettre à jour et de supprimer des données à l'aide d'objets appelés entités. Il mappe les entités et les relations définies dans votre modèle d'entité et fournit des fonctions pour effectuer les tâches suivantes :

    1. Matérialiser les données renvoyées par la base de données en tant qu'objets
    2. Contrôler les modifications apportées aux objets
    3. Apporter des modifications à la base de données
    4. Travailler avec la concurrence
    5. Lier des objets aux contrôles

    Dans ce projet, nous utiliserons une base de données appelée SQLite, qui est une bibliothèque en langage C qui implémente un petit, rapide, autonome, très fiable et moteur de base de données SQL complet.

    Nous devons installer les packages suivants dans le projet :

    • “Microsoft.EntityFrameworkCore” Version=“5.0.9”
    • “Microsoft.EntityFrameworkCore.Design” Version=“5.0 .9"
    • Version "Microsoft.EntityFrameworkCore.Sqlite"="5.0.9"
    • Version "Microsoft.EntityFrameworkCore.Sqlite.Design"="1.1.6"
    • Version "Microsoft.EntityFrameworkCore.Tools" = "5.0.9"

    Vous pouvez le faire via le gestionnaire de packages NuGet.

    T Toujours dans le dossier Models, créez une classe appelée « BookContext » et placez-y le code suivant :

    public class BookContext : DbContext
    {
      public BookContext(DbContextOptions<BookContext> options) : base[19659045](options) { }
      public DbSet<Book> Livres { get ; set; }
      protected override void OnModelCreating(ModelBuilder builder)
      { 
        constructeur.Entité<Livre>().HasKey(b => b.Id);
        base.OnModelCreating(builder) ;
      }
    }
    

    Avec ce code, nous définissons que « Book » est notre classe de contexte, qui recevra dans la base de données une entité du même nom et aura ses propriétés (nom, auteur, etc.) sous forme de colonnes dans la table book.

    Nous avons également défini que l'Id sera la clé primaire de la table via la méthode OnModelCreating.

    Création de la chaîne de connexion SQLite

    Créons notre chaîne de connexion, qui ouvrira une connexion à la base de données que nous appellerons "ReadingList.db".

    Ouvrez l'archive "appsettings.json" et placez ce code avant "Logging":

    "ConnectionSqlite": { " SqliteConnectionString": "Data Source=ReadingList.db" },
    

    Registering Context With Dependency Injection

    ASP.NET Core implémente l'injection de dépendances par défaut. Maintenant que nous avons créé notre classe Context, nous devons faire l'injection de dépendances de cette classe. ASP.NET Core nous permet de faire l'injection au démarrage de notre application.

    Pour ce faire, ouvrez le fichier Startup.cs et remplacez la méthode ConfigureServices par ceci :

    public  void ConfigureServices(IServiceCollection services)
    {
      services.Ajouter des contrôleurs() ;
      services.AddSwaggerGen(c =>
      {
        c.SwaggerDoc("v1", new OpenApiInfo { Titre = "MyReadingList.WebAPI ", Version = "v1" });
      });
    
      var connection = Configuration["ConnectionSqlite:SqliteConnectionString"];
      services.AddDbContext<BookContext>(options => options.[19659124]UseSqlite(connection));
    }
    

    Création de la base de données

    Maintenant que tout est configuré, nous pouvons créer la base de données à partir du modèle à l'aide de « Migrations ».

    La fonction de migration vous permet d'apporter des modifications à votre modèle, puis de propager ces modifications dans votre schéma de base de données. Les migrations sont activées par défaut dans EF Core.

    Le processus est très simple. Accédez au dossier dans lequel le projet a été créé, ouvrez une console et entrez les commandes ci-dessous.

    dotnet ef migrations add InitialModel
    

    Et puis :

    mise à jour de la base de données dotnet ef
    

    Commandes Powershell

    La première commande consiste à prendre en charge la migration et à créer l'ensemble initial de tables pour le modèle. La seconde consiste à appliquer la migration à la base de données.

    🔴🟡🟢 Important ! Si, lors de l'exécution des commandes, vous obtenez des erreurs liées à la version d'EntityFramework, exécutez cette commande dans la console :[19659197] mise à jour de l'outil dotnet –global dotnet-ef –version 5.0.9

    Si tout s'est bien passé, vous verrez la base de données créée à la racine du projet – là où vous avez ouvert la console, dans le fichier "ReadingList.db", c'est là que se trouve notre base de données. Pour ouvrir ce fichier et voir les tables créées comme dans notre modèle, vous devrez télécharger une application compatible SQLite. Si vous utilisez Windows, je vous recommande le "SQLite Viewer Editor" – il est gratuit et peut être téléchargé directement depuis le Microsoft Store.

    La base de données dans "SQLite Viewer Editor"

     Base de données dans SQLite Viewer Editor

    En plus de la table « Livres », nous avons également le « __EFMigrationsHistory » qui est automatiquement créé lorsque nous appliquons les migrations et est utilisé pour suivre les versions modifiées, comme un historique.

    Création du contrôleur

    Nous allons maintenant créer un contrôleur pour pouvoir effectuer des opérations CRUD dans notre base de données. Pour ce faire, effectuez les étapes suivantes :

    1. Cliquez avec le bouton droit sur le dossier « Contrôleurs » → Ajouter → Contrôleur → Sélectionnez « Contrôleur MVC – Vide » → Ajouter
    2. Nommez-le « LivresContrôleur »
    3. Ouvrez le fichier généré et remplacez votre code par celui-ci :
    using Microsoft.AspNetCore.Mvc;
    using MyReadingList. WebAPI.Modèles;
    
    espace de noms MyReadingList.WebAPI.Contrôleurs
    {
      [Route("api/[contrôleur]")]
      [ApiController]
      public  classe LivresContrôleur  : Contrôleur
      {
        private readonly BookContext _context;
        public BooksController(BookContext context)
        {
          _context = contexte;
        }
      }
    }
    

    Avec ce code, nous avons fait l'injection de dépendance de contexte dans le contrôleur. Ensuite, nous allons implémenter les méthodes chargées d'effectuer les opérations (CRUD) :

    GET/api/booksObtenir tous les livresNoneArray of books
    GET/ api/books/read=trueLisez tous les livresAucunTableau de livres
    GET/api/books/{id}Obtenez un livre par Id AucunLivre
    POST/api/booksAjouter un nouveau livreLivreLivre
    PUT/api/books/{id}Mettre à jour un livre existantLivreAucun
    DELETE/api/books/{id}Supprimer un livreAucunAucun

    Mettre en œuvre des méthodes API

    Suivant l'ordre dans le tableau ci-dessus, nous allons implémenter les méthodes API chargées d'effectuer les opérations CRUD dans la base de données. Toujours dans "BooksController", vous pouvez mettre ce code juste en dessous de l'injection de dépendance :

    
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Livre>>> GetBooks()
    {
      retour  wait _context.Books.ToListAsync();
    }
    
    
    [HttpGet([19659166]"read")]
    public async Task<ActionResult<IEnumerable<Book>>> GetBooksRead()
    {
      bool read = true;
       var livres = attente _context.Livres.ToListAsync[1 9659045]();
      
      var livresLire = (from livre dans livres  livre.Lire == lire sélectionner livre).ÀListe() ; 
      
      retourner livresLire;
    }
    
    
    [HttpGet("{id}")]
    public[19659040]async Task<ActionResult<Book>> GetBook(string id) 
    {
      Guid guidId = Guid.Parse(id);
      
      var livre = attend  _context.Livres.FindAsync(guidId);
      
      if (livre == null)
        retour NotFound();
      
      retour livre;
    }
    
    
     [HttpPost]
    [Route("create")]
    public async Tâche <ActionResult<Livre>> Créer(Livre livre)
    {
      _context.Livres.Ajouter(livre);
      wait _context.SaveChangesAsync 19659045]();
      return CreatedAtAction("GetBook", new { id = livre.Id }, livre);
    }
    
    
    [HttpPut( "{id}")]
    public async Tâche<IActionResult> Mise à jour(string id, Livre livre)
    {
      if (id != Convertir.ToString[19659045](livre.Id).ToUpper())
        retour BadRequest ()[19659045];
    
      _context.Entrée(book).État = EntityState.Modifié;[19659180]try
      {
        wait _context.SaveChangesAsync();
      }
      catch ( DbUpdateConcurrencyException)
      {
        if (!BookExists(id))
          retour NotFound[19659045]();
        }
    
      retour NoContent();
    }
    
    
    [HttpDelete ("{id}")]
    public async Tâche<IActionResult> Supprimer([19659310]chaîne id)
    {
      Guid guidId = Guid.Parse(id);
    
      var livre = attend  _context.Livres.FindAsync(guidId);
    
      if (livre == null)
        retour NotFound();
    
      _context.Livres.Supprimer(livre);
    
      wait _context.SaveChangesAsync 19659045]();
    
      return NoContent();
    }
    
    
    private bool Livre existe (string id)
    {
      return _context.Books.Tout(e => Convertir.ToString(e.Id) == id);
    }
    

    Exécution d'opérations (CRUD) avec Fiddler Everywhere

    Maintenant, nous avons les bases dont nous avons besoin pour créer, mettre à jour, supprimer et récupérer des livres à partir de la base de données. Pour ce faire, lancez d'abord le projet en cliquant sur l'icône d'exécution dans Visual Studio ou en appuyant sur la touche "F5".

    Créer

    Pour effectuer les opérations, nous utiliserons Fiddler Everywherequi peut être utilisé pour envoyer des requêtes HTTP aux API Web de manière simple et rapide, et possède de nombreuses autres fonctionnalités.

    Suivez les étapes de l'image ci-dessous pour ajouter un livre à la base de données via la méthode Create de l'API. Ensuite, vous pouvez ouvrir le fichier ReadingList.db avec SQLite Viewer Editor et voir l'enregistrement dans le tableau.

    Créer un livre

    🔴🟡🟢 Important ! Les exemples d'images auront le port localhost défini sur 44345, mais vous devez le modifier en fonction du port sur lequel votre application s'exécute.

    Obtenir tous les livres

    Maintenant que nous avons inséré notre livre (vous pouvez en insérer autant que vous comme, il suffit de modifier les données envoyées dans le "corps"), nous pouvons les rechercher via la route "GET". « Mettre à jour le livre », dans le contenu du « Corps », modifiez les données de « lu » à « vrai » et cliquez sur « Envoyer ». itinéraire suivant.

    Mettre à jour un livre

    Obtenir tous les livres (lus)

    Nous ne chercherons que les livres qui ont déjà été lus. Pour cela, nous utiliserons une autre route, et cette route ne renverra que les enregistrements qui ont la propriété "read"="true", comme vous pouvez le voir dans l'image ci-dessous :

    Get All Books Read

    Get a Book by Id

    Pour rechercher un seul livre spécifique, nous utiliserons la même route « GET », mais en passant dans la route l'ID du livre dont nous voulons voir les détails.

    Obtenir un livre par Id

    Supprimer

    Pour supprimer un enregistrement est très simple : il suffit de passer l'identifiant de l'enregistrement que vous souhaitez supprimer dans la route, comme dans l'exemple ci-dessous :

    Supprimer un livre

    Conclusion

    Enfin ! Notre API est fonctionnelle à 100 % ! 🏅✨

    Dans cet article, nous avons examiné les bases des API Web ASP.NET Core, créé un projet à l'aide de Visual Studio, ajouté une base de données et effectué les quatre opérations de base (CRUD) avec Fiddler Everywhere.

    Maintenant. vous pouvez remplir votre liste avec vos livres préférés. N'hésitez pas à ajouter de nouveaux champs et fonctionnalités.

    Dans le prochain article sur les API, nous développerons une application frontale et l'intégrerons à notre API pour afficher les enregistrements. À bientôt! 🙋‍♂️




Source link