Partager via


Créer des API serverless dans Visual Studio à l’aide d’Azure Functions et de l’intégration d’API Management

Les API REST utilisent souvent un fichier de définition OpenAPI (anciennement Swagger). Ce fichier contient des informations sur les opérations d’une API et sur la manière dont les données de requête et de réponse de l’API doivent être structurées.

Dans ce tutoriel, vous allez apprendre à :

  • Créer le projet de code dans Visual Studio
  • Installer l’extension OpenAPI
  • Ajouter un point de terminaison de déclencheur HTTP, qui inclut des définitions OpenAPI
  • Tester les API de fonction localement à l’aide des fonctionnalités OpenAPI intégrées
  • Publier le projet dans une application de fonction dans Azure
  • Activer l’intégration du service Gestion des API
  • Télécharger le fichier de définition OpenAPI

La fonction serverless que vous créez fournit une API qui vous permet de déterminer si une réparation d’urgence sur une éolienne est rentable. Étant donné que vous créez l’application de fonction et l’instance Gestion des API dans un niveau de consommation, le coût d’exécution de ce tutoriel est minime.

Prérequis

Créer le projet de code

Le modèle de projet Azure Functions dans Visual Studio crée un projet que vous pouvez publier dans une application de fonction dans Azure. Vous allez également créer une fonction déclenchée via HTTP à partir d’un modèle qui prend en charge la génération du fichier de définition OpenAPI (anciennement Swagger).

  1. Dans le menu de Visual Studio, sélectionnez Fichier>Nouveau>Projet.

  2. Dans Créer un projet, entrez functions dans la zone de recherche, choisissez le modèle Azure Functions, puis sélectionnez Suivant.

  3. Dans Configurer votre nouveau projet, entrez un Nom de projet tel que TurbineRepair, puis sélectionnez Créer.

  4. Pour les paramètres Créer une application Azure Functions, sélectionnez l’une de ces options pour Worker Functions, en fonction du modèle de processus choisi :

    .NET 8.0 Isolé (Support à long terme) : vos fonctions C# s’exécutent dans le modèle Worker isolé, ce qui est recommandé. Pour plus d’informations, consultez le guide du modèle Worker isolé.

  5. Pour les options restantes, utilisez les valeurs du tableau suivant :

    Paramètre valeur Description
    Modèle de fonction Vide Ce paramètre crée un projet sans déclencheur, ce qui vous donne plus de contrôle sur le nom de la fonction déclenchée via HTTP lorsque vous l’ajoutez ultérieurement.
    Utiliser Azurite pour le compte de stockage du runtime (AzureWebJobsStorage) Selected Vous pouvez utiliser l’émulateur pour le développement local des fonctions de déclencheur HTTP. Étant donné qu’une application de fonction dans Azure nécessite un compte de stockage, celui-ci est attribué ou créé quand vous publiez votre projet sur Azure.
    Niveau d’autorisation Fonction Dans Azure, les clients doivent fournir une clé lors de l’accès au point de terminaison. Pour plus d’informations, consultez Niveau d’autorisation.
  6. Sélectionnez Créer pour créer le projet de fonction.

Ensuite, vous mettez à jour le projet en installant l’extension OpenAPI pour Azure Functions, ce qui permet la découverte des points de terminaison d’API dans votre application.

Installer l’extension OpenAPI

Pour installer l’extension OpenAPI :

  1. Dans le menu Outils, sélectionnez Gestionnaire de package NuGet>Console du gestionnaire de package.

  2. Dans la console, exécutez la commande Install-Package suivante pour installer l’extension OpenAPI :

    NuGet\Install-Package Microsoft.Azure.Functions.Worker.Extensions.OpenApi -Version 1.5.1
    

    Vous devrez peut-être mettre à jour la version spécifique, en fonction de votre version de .NET.

Vous pouvez à présent ajouter votre fonction de point de terminaison HTTP.

Ajouter une fonction de point de terminaison HTTP

Dans une bibliothèque de classes C#, les liaisons utilisées par la fonction sont définies en appliquant des attributs dans le code. Pour créer une fonction avec un déclencheur HTTP :

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet et sélectionnez Ajouter>Nouvelle fonction Azure.

  2. Entrez la classe Turbine.cs, puis sélectionnez Ajouter.

  3. Choisissez le modèle Déclencheur HTTP, définissez le niveau d’autorisation sur Fonction, puis sélectionnez Ajouter. Un fichier de code Turbine.cs est ajouté à votre projet pour définir un nouveau point de terminaison de fonction avec un déclencheur HTTP.

Vous pouvez à présent remplacer le code du modèle de déclencheur HTTP par du code qui implémente le point de terminaison de fonction Turbine, ainsi que les attributs qui utilisent OpenAPI pour définir le point de terminaison.

Mettre à jour le code de fonction

La fonction utilise un déclencheur HTTP qui accepte deux paramètres :

Nom du paramètre Description
hours Durée estimée pour la réparation d’une turbine, jusqu’à l’heure entière la plus proche.
capacité La capacité de l’éolienne, exprimée en kilowatts.

La fonction calcule ensuite le coût de la réparation et les revenus engendrés par 24 heures de fonctionnement de l’éolienne. Les paramètres sont fournis dans la chaîne de requête ou dans la charge utile d’une requête POST.

Dans le fichier de projet Turbine.cs, remplacez le contenu de la classe générée à partir du modèle de déclencheur HTTP par le code suivant, qui dépend de votre modèle de processus :

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Attributes;
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using System.Net;

namespace TurbineRepair
{
    public class Turbine
    {
        const double revenuePerkW = 0.12;
        const double technicianCost = 250;
        const double turbineCost = 100;

        private readonly ILogger<Turbine> _logger;

        public Turbine(ILogger<Turbine> logger)
        {
            _logger = logger;
        }

        [Function("TurbineRepair")]
        [OpenApiOperation(operationId: "Run")]
        [OpenApiSecurity("function_key", SecuritySchemeType.ApiKey, Name = "code", In = OpenApiSecurityLocationType.Query)]
        [OpenApiRequestBody("application/json", typeof(RequestBodyModel),
            Description = "JSON request body containing { hours, capacity}")]
        [OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "application/json", bodyType: typeof(string),
            Description = "The OK response message containing a JSON result.")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            // Get request body data.
            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic? data = JsonConvert.DeserializeObject(requestBody);
            int? capacity = data?.capacity;
            int? hours = data?.hours;

            // Return bad request if capacity or hours are not passed in
            if (capacity == null || hours == null)
            {
                return new BadRequestObjectResult("Please pass capacity and hours in the request body");
            }
            // Formulas to calculate revenue and cost
            double? revenueOpportunity = capacity * revenuePerkW * 24;
            double? costToFix = hours * technicianCost + turbineCost;
            string repairTurbine;

            if (revenueOpportunity > costToFix)
            {
                repairTurbine = "Yes";
            }
            else
            {
                repairTurbine = "No";
            };

            return new OkObjectResult(new
            {
                message = repairTurbine,
                revenueOpportunity = "$" + revenueOpportunity,
                costToFix = "$" + costToFix
            });
        }
        public class RequestBodyModel
        {
            public int Hours { get; set; }
            public int Capacity { get; set; }
        }
    }
}

Ce code de fonction retourne un message Yes ou No pour indiquer si une réparation d’urgence est rentable. Elle retourne également l’opportunité de revenu que représente la turbine et le coût de la réparation.

Exécuter et vérifier l’API localement

Lorsque vous exécutez la fonction, les points de terminaison OpenAPI facilitent l’essai de la fonction localement à l’aide d’une page générée. Vous n’avez pas besoin de fournir des clés d’accès de fonction lors de l’exécution locale.

  1. Appuyez sur F5 pour démarrer le projet. Lorsque le runtime Azure Functions démarre localement, un jeu de points de terminaison OpenAPI et Swagger est affiché dans la sortie, ainsi que le point de terminaison de la fonction.

  2. Dans votre navigateur, ouvrez le point de terminaison RenderSwaggerUI, qui doit ressembler à http://localhost:7071/api/swagger/ui. Une page est produite en fonction de vos définitions OpenAPI.

  3. Sélectionnez POST>Essayer, entrez des valeurs pour hours et capacity en tant que paramètres de requête ou dans le corps de la requête JSON, puis sélectionnez Exécuter.

    Interface utilisateur Swagger pour tester l’API TurbineRepair

  4. Lorsque vous entrez des valeurs entières telles que 6 pour hours et 2500 pour capacity, vous obtenez une réponse JSON ressemblant à l’exemple suivant :

    Réponse des données JSON à partir de la fonction TurbineRepair.

Vous disposez maintenant d’une fonction qui détermine la rentabilité des réparations d’urgence. Ensuite, vous publiez votre projet et vos définitions d’API dans Azure.

Publication du projet sur Azure

Avant de pouvoir publier votre projet, vous devez disposer d’une application de fonction dans votre abonnement Azure. La publication Visual Studio crée une application de fonction automatiquement la première fois que vous publiez votre projet. Elle peut également créer une instance Gestion des API qui s’intègre à votre application de fonction pour exposer l’API TurbineRepair.

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet et sélectionnez Publier puis, dans Cible, sélectionnez Azure, puis Suivant.

  2. Pour Cible spécifique, choisissez Application de fonction Azure (Windows) afin de créer une application de fonction s’exécutant sur Windows, puis sélectionnez Suivant.

  3. Dans Instance de la fonction, choisissez + Créer une application Azure Function... .

    Créer une instance d’application de fonction

  4. Créez une instance en utilisant les valeurs spécifiées dans le tableau suivant :

    Paramètre valeur Description
    Nom Nom globalement unique Nom qui identifie uniquement votre nouvelle application de fonction. Acceptez ce nom ou entrez un nouveau nom. Les caractères valides sont a-z, 0-9 et -.
    Abonnement Votre abonnement Sélectionnez l’abonnement Azure à utiliser. Acceptez cet abonnement ou sélectionnez-en un nouveau dans la liste déroulante.
    Groupe de ressources Nom de votre groupe de ressources Groupe de ressources dans lequel créer votre application de fonction. Sélectionnez un groupe de ressources existant dans la liste déroulante, ou choisissez Créer pour créer un groupe de ressources.
    Type de plan Consommation Quand vous publiez votre projet dans une application de fonction qui s’exécute dans un Plan Consommation, vous payez uniquement pour les exécutions de votre application de fonction. D’autres plans d’hébergement occasionnent des coûts plus élevés.
    Lieu Emplacement du service Choisissez un Emplacement dans une région proche de chez vous, ou proche d’autres services auxquels vos fonctions ont accès.
    Stockage Azure Compte de stockage à usage général Le runtime Functions exige un compte Stockage Azure. Sélectionnez Nouveau pour configurer un compte de stockage universel. Vous pouvez également choisir un compte existant qui répond aux exigences relatives aux comptes de stockage.

    Créer une application de fonction dans Azure avec Stockage

  5. Sélectionnez Créer pour créer une application de fonction et les ressources associées dans Azure. L’état de la création des ressources est affiché en bas à gauche de la fenêtre.

  6. De retour dans Instance de fonction, vérifiez que Exécuter à partir du fichier de package est coché. Votre application de fonction est déployée en utilisant Zip Deploy avec le mode Exécuter à partir du fichier de package activé. Cette méthode de déploiement est recommandée pour votre projet Functions, car elle offre de meilleures performances.

  7. Sélectionnez Suivant, puis, dans la page Gestion des API, choisissez également + Create an API Management API (Créer une API Gestion des API).

  8. Créez une API dans Gestion des API à l’aide des valeurs du tableau suivant :

    Paramètre valeur Description
    Nom de l’API TurbineRepair Nom de l’API.
    Nom d’abonnement Votre abonnement Sélectionnez l’abonnement Azure à utiliser. Acceptez cet abonnement ou sélectionnez-en un nouveau dans la liste déroulante.
    Groupe de ressources Nom de votre groupe de ressources Sélectionnez le même groupe de ressources que votre application de fonction dans la liste déroulante.
    Service Gestion des API Nouvelle instance Sélectionnez Nouveau pour créer une instance Gestion des API au même emplacement dans le niveau serverless. Sélectionnez OK pour créer l’instance.

    Créer une instance Gestion des API avec une API

  9. Sélectionnez Créer pour créer l’instance Gestion des API avec l’API TurbineRepair à partir de l’intégration de la fonction.

  10. Sélectionnez Terminer. Une fois le processus de création du profil de publication terminé, sélectionnez Fermer.

  11. Vérifiez que la page Publier indique à présent Prêt à publier, puis sélectionnez Publier pour déployer le package contenant vos fichiers de projet vers votre nouvelle application de fonction dans Azure.

    Une fois le déploiement terminé, l’URL racine de l’application de fonction dans Azure est affichée sous l’onglet Publier.

Obtenir la clé d’accès à une fonction

  1. Sous l’onglet Publier, sélectionnez les points de suspension ( ... ) en regard de Hébergement, puis sélectionnez Ouvrir dans le portail Azure. L’application de fonction que vous avez créée est ouverte dans le Portail Azure dans votre navigateur par défaut.

  2. Sous Fonctions dans la page de vue d’ensemble, sélectionnez >Turbine, puis sélectionnez Touches de fonction.

    Obtenir une clé d’accès pour la fonction TurbineRepair

  3. Sous Touches de fonction, sélectionnez l’icône Copier dans le Presse-papiers située en regard de la touche par défaut. Vous pouvez à présent définir cette touche copiée dans Gestion des API pour qu’elle puisse accéder au point de terminaison de la fonction.

Configuration de Gestion des API

  1. Dans la page de l’application de fonction, développez API, puis sélectionnez Gestion des API.

  2. Si l’application de fonction n’est pas déjà connectée à la nouvelle instance Gestion des API, sélectionnez-la sous Gestion des API, sélectionnez API>Document OpenAPI sur Azure Functions, assurez-vous que l’option Importer des fonctions est activée, puis sélectionnez Lier l’API. Assurez-vous que seul TurbineRepair est sélectionné pour l’importation, puis choisissez Sélectionner.

  3. Sélectionnez Accéder à Gestion des API en haut de la page, puis, dans l’instance Gestion des API, développez API.

  4. Sous API>Toutes les API, sélectionnez Document OpenAPI sur Azure Functions>POST Run, puis, sous Traitement entrant, sélectionnez Ajouter une stratégie>Définition des paramètres de la requête.

  5. Dans Traitement entrant, choisissez Définir les paramètres de la requête, tapez code dans Name (Nom), sélectionnez +Value (Valeur), collez la touche de fonction copiée, puis sélectionnez Enregistrer. La Gestion des API comprend la touche de fonction lors du passage de l’appel au point de terminaison de la fonction.

    Fournir des informations d’identification de fonction à la règle de traitement entrant de l’API

Maintenant que la touche de fonction est définie, vous pouvez appeler le point de terminaison d’API turbine pour vérifier qu’il fonctionne lorsqu’il est hébergé dans Azure.

Vérifier l’API dans Azure

  1. Dans l’API, sélectionnez l’onglet Test, puis POST Run, entrez le code suivant dans le Corps de la demande>Raw (Brut), puis sélectionnez Envoyer :

    {
        "hours": "6",
        "capacity": "2500"
    }
    

    Page de test OpenAPI dans l’API Gestion des API

    Comme précédemment, vous pouvez également fournir les mêmes valeurs que les paramètres de requête.

  2. Sélectionnez Envoyer, puis affichez la Réponse HTTP pour vérifier que les mêmes résultats sont retournés à partir de l’API.

Télécharger la définition OpenAPI

Si votre API fonctionne comme prévu, vous pouvez télécharger la définition OpenAPI pour les nouvelles API hébergées à partir de Gestion des API.

    1. Sous API, sélectionnez OpenAPI Document sur Azure Functions, sélectionnez les points de suspension (...) et sélectionnez Exporter.

    Télécharger la définition OpenAPI

  1. Choisissez les moyens d’exportation d’API, y compris les fichiers OpenAPI dans différents formats. Vous pouvez également exporter des API depuis Gestion des API Azure vers Power Platform.

Nettoyer les ressources

Au cours des étapes précédentes, vous avez créé des ressources Azure au sein d’un groupe de ressources. Si vous ne pensez pas avoir besoin de ces ressources à l’avenir, vous pouvez les supprimer en supprimant le groupe de ressources.

Dans le menu ou la page d’accueil du portail Azure, sélectionnez Groupes de ressources. Ensuite, dans la page Groupes de ressources, sélectionnez le groupe que vous avez créé.

Dans la page myResourceGroup, assurez-vous que les ressources répertoriées sont bien celles que vous souhaitez supprimer.

Sélectionnez Supprimer le groupe de ressources, tapez le nom de votre groupe dans la zone de texte pour confirmer, puis sélectionnez Supprimer.

Étapes suivantes

Vous avez utilisé Visual Studio 2022 pour créer une fonction qui est auto-documentée en raison de l’extension OpenAPI et qui est intégrée à Gestion des API. Vous pouvez maintenant affiner la définition dans la page Gestion des API du portail. Vous pouvez aussi en savoir plus sur la Gestion des API.