Dela via


Skapa serverlösa API:er i Visual Studio med hjälp av Azure Functions- och API Management-integrering

REST-API:er beskrivs ofta med hjälp av en OpenAPI-definitionsfil (tidigare kallad Swagger). Den här filen innehåller information om åtgärder i ett API och hur begärande- och svarsdata för API:et ska struktureras.

I den här självstudien lär du dig att:

  • Skapa kodprojektet i Visual Studio
  • Installera OpenAPI-tillägget
  • Lägg till en HTTP-utlösarslutpunkt, som innehåller OpenAPI-definitioner
  • Testa funktions-API:er lokalt med hjälp av inbyggda OpenAPI-funktioner
  • Publicera projekt till en funktionsapp i Azure
  • Aktivera API Management-integrering
  • Ladda ned OpenAPI-definitionsfilen

Den serverlösa funktion som du skapar tillhandahåller ett API som gör att du kan avgöra om en nödreparation på en vindkraftverk är kostnadseffektiv. Eftersom du skapar både funktionsappen och API Management-instansen på en förbrukningsnivå är kostnaden för att slutföra den här självstudien minimal.

Förutsättningar

Skapa kodprojektet

Azure Functions-projektmallen i Visual Studio skapar ett projekt som du kan publicera till en funktionsapp i Azure. Du skapar också en HTTP-utlöst funktion från en mall som stöder generering av OpenAPI-definitionsfil (tidigare Swagger-fil).

  1. På Visual Studio-menyn väljer du Arkiv>Nytt>projekt.

  2. I Skapa ett nytt projekt anger du funktioner i sökrutan, väljer Azure Functions-mallen och väljer sedan Nästa.

  3. I Konfigurera det nya projektet anger du ett projektnamn för projektet som TurbineRepairoch väljer sedan Skapa.

  4. För inställningarna för Skapa ett nytt Azure Functions-program väljer du något av följande alternativ för Functions Worker, där det alternativ du väljer beror på din valda processmodell:

    .NET 8.0 Isolerad (långsiktigt stöd): C#-funktionerna körs i den isolerade arbetsmodellen, vilket rekommenderas. Mer information finns i guiden för isolerade arbetsmodeller.

  5. Använd värdena i följande tabell för resten av alternativen:

    Inställning Värde beskrivning
    Funktionsmall Tom Detta skapar ett projekt utan utlösare, vilket ger dig mer kontroll över namnet på den HTTP-utlösta funktionen när du lägger till det senare.
    Använda Azurite för körningslagringskonto (AzureWebJobsStorage) Vald Du kan använda emulatorn för lokal utveckling av HTTP-utlösarfunktioner. Eftersom en funktionsapp i Azure kräver ett lagringskonto tilldelas eller skapas en när du publicerar projektet till Azure.
    Auktoriseringsnivå Funktion När du kör i Azure måste klienterna ange en nyckel vid åtkomst till slutpunkten. Mer information finns i auktoriseringsnivå.
  6. Välj Skapa för att skapa funktionsprojektet.

Sedan uppdaterar du projektet genom att installera OpenAPI-tillägget för Azure Functions, vilket möjliggör identifiering av API-slutpunkter i din app.

Installera OpenAPI-tillägget

Så här installerar du OpenAPI-tillägget:

  1. På menyn Verktyg väljer du NuGet Package Manager Package Manager>Console.

  2. I -konsolen kör du följande Install-Package-kommando för att installera OpenAPI-tillägget:

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

    Du kan behöva uppdatera den specifika versionen baserat på din version av .NET.

Nu kan du lägga till http-slutpunktsfunktionen.

Lägga till en HTTP-slutpunktsfunktion

I ett C#-klassbibliotek definieras de bindningar som används av funktionen genom att använda attribut i koden. Så här skapar du en funktion med en HTTP-utlösare:

  1. Högerklicka på projektnoden i Solution Explorer och välj Lägg till>ny Azure-funktion.

  2. Ange Turbine.cs för klassen och välj sedan Lägg till.

  3. Välj mallen Http-utlösare, ange auktoriseringsnivå till Funktion och välj sedan Lägg till. En Turbine.cs kodfil läggs till i projektet som definierar en ny funktionsslutpunkt med en HTTP-utlösare.

Nu kan du ersätta mallkoden för HTTP-utlösaren med kod som implementerar turbinfunktionens slutpunkt, tillsammans med attribut som använder OpenAPI för att definiera slutpunkten.

Uppdatera funktionskoden

Funktionen använder en HTTP-utlösare som tar två parametrar:

Parameternamn beskrivning
hours Den beräknade tiden för att göra en turbinreparation, upp till närmaste hela timme.
kapacitet Kapaciteten av turbinen, i kilowatt.

Funktionen beräknar sedan hur mycket en reparation kostar och hur mycket intäkter turbinen kan göra under en 24-timmarsperiod. Parametrar anges antingen i frågesträngen eller i nyttolasten för en POST-begäran.

I Turbine.cs-projektfilen ersätter du innehållet i klassen som genererats från HTTP-utlösarmallen med följande kod, vilket beror på din processmodell:

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

Den här funktionskoden returnerar ett meddelande om Yes eller No för att ange om en nödreparation är kostnadseffektiv. Den returnerar också den intäktsmöjlighet som turbinen representerar och kostnaden för att åtgärda turbinen.

Köra och verifiera API:et lokalt

När du kör funktionen gör OpenAPI-slutpunkterna det enkelt att prova funktionen lokalt med hjälp av en genererad sida. Du behöver inte ange funktionsåtkomstnycklar när du kör lokalt.

  1. Starta projektet genom att trycka på F5. När Functions-körningen startar lokalt visas en uppsättning OpenAPI- och Swagger-slutpunkter i utdata, tillsammans med funktionsslutpunkten.

  2. Öppna slutpunkten RenderSwaggerUI i webbläsaren, som bör se ut som http://localhost:7071/api/swagger/ui. En sida återges baserat på dina OpenAPI-definitioner.

  3. Välj POST>Prova, ange värden för hours och capacity antingen som frågeparametrar eller i JSON-begärandetexten och välj Kör.

    Swagger-användargränssnitt för att testa TurbineRepair-API:et

  4. När du anger heltalsvärden som 6 för hours och 2500 för capacityfår du ett JSON-svar som ser ut som i följande exempel:

    Svar på JSON-data från funktionen TurbineRepair.

Nu har du en funktion som avgör om en nödreparation är kostnadseffektiv. Därefter publicerar du dina projekt- och API-definitioner till Azure.

Publicera projektet på Azure

Innan du kan publicera projektet måste du ha en funktionsapp i din Azure-prenumeration. Visual Studio-publicering skapar en funktionsapp första gången du publicerar projektet. Den kan också skapa en API Management-instans som integreras med din funktionsapp för att exponera TurbineRepair-API:et.

  1. I Solution Explorer högerklickar du på projektet och väljer Publicera och i Mål väljer du Azure och sedan Nästa.

  2. För Det specifika målet väljer du Azure Function App (Windows) för att skapa en funktionsapp som körs i Windows och väljer sedan Nästa.

  3. I Funktionsinstans väljer du + Skapa en ny Azure-funktion....

    Skapa en ny funktionsappinstans

  4. Skapa en ny instans med de värden som anges i följande tabell:

    Inställning Värde Beskrivning
    Namn Globalt unikt namn Namn som unikt identifierar din nya funktionsapp. Acceptera det här namnet eller ange ett nytt namn. Giltiga tecken är: a-z, 0-9och -.
    Abonnemang Din prenumeration Den Azure-prenumeration som ska användas. Acceptera den här prenumerationen eller välj en ny i listrutan.
    Resursgrupp Namnet på resursgruppen Den resursgrupp där du vill skapa funktionsappen. Välj en befintlig resursgrupp i listrutan eller välj Ny för att skapa en ny resursgrupp.
    Plantyp Förbrukning När du publicerar projektet till en funktionsapp som körs i en förbrukningsplan betalar du bara för körningar av funktionsappen. Andra värdplaner medför högre kostnader.
    Plats Platsen för tjänsten Välj en plats i en region nära dig eller andra tjänster som dina funktioner har åtkomst till.
    Azure Storage Allmänt lagringskonto Ett Azure Storage-konto krävs av Functions-körningen. Välj Ny för att konfigurera ett allmänt lagringskonto. Du kan också välja ett befintligt konto som uppfyller kraven för lagringskontot.

    Skapa en ny funktionsapp i Azure med Storage

  5. Välj Skapa för att skapa en funktionsapp och dess relaterade resurser i Azure. Status för resursskapande visas längst ned till vänster i fönstret.

  6. Tillbaka i Functions-instansen kontrollerar du att Kör från paketfilen är markerad. Funktionsappen distribueras med Zip Deploy med Läget Run-From-Package aktiverat. Den här distributionsmetoden rekommenderas för ditt funktionsprojekt eftersom den ger bättre prestanda.

  7. Välj Nästa och på sidan API Management väljer du även + Skapa ett API Management-API.

  8. Skapa ett API i API Management med hjälp av värden i följande tabell:

    Inställning Värde beskrivning
    API-namn TurbineRepair Namn på API:et.
    Prenumerationsnamn Din prenumeration Den Azure-prenumeration som ska användas. Acceptera den här prenumerationen eller välj en ny i listrutan.
    Resursgrupp Namnet på resursgruppen Välj samma resursgrupp som funktionsappen i listrutan.
    API Management-tjänsten Ny instans Välj Ny för att skapa en ny API Management-instans på samma plats på den serverlösa nivån. Välj OK för att skapa instansen.

    Skapa API Management-instans med API

  9. Välj Skapa för att skapa API Management-instansen med TurbineRepair-API:et från funktionsintegrering.

  10. Välj Slutför och när publiceringsprofilen har skapats väljer du Stäng.

  11. Kontrollera att sidan Publicera nu står Klar att publicera och välj sedan Publicera för att distribuera paketet som innehåller dina projektfiler till den nya funktionsappen i Azure.

    När distributionen är klar visas rot-URL:en för funktionsappen i Azure på fliken Publicera .

Hämta funktionsåtkomstnyckeln

  1. På fliken Publicera väljer du ellipserna (...) bredvid Värd och väljer Öppna i Azure Portal. Funktionsappen som du skapade öppnas i Azure Portal i standardwebbläsaren.

  2. Under Funktioner på sidan Översikt väljer du> Turbin och sedan Funktionsnycklar.

    Hämta en åtkomstnyckel för funktionen TurbineRepair

  3. Under Funktionsnycklar väljer du ikonen kopiera till Urklipp bredvid standardnyckeln. Nu kan du ange den här nyckeln som du kopierade i API Management så att den kan komma åt funktionsslutpunkten.

Konfigurera API Management

  1. På funktionsappsidan expanderar du API och väljer API Management.

  2. Om funktionsappen inte redan är ansluten till den nya API Management-instansen väljer du den under API Management, väljer API>OpenAPI-dokument i Azure Functions, kontrollerar att importfunktionerna är markerade och väljer Länk-API. Kontrollera att endast TurbineRepair har valts för import och välj sedan .

  3. Välj Gå till API Management överst på sidan och expandera API:er i API Management-instansen.

  4. Under API:er>Alla API:er väljer du OpenAPI-dokument på Azure Functions>POST Run och under Inkommande bearbetning väljer du Lägg till frågeparametrar för principuppsättning.>

  5. Under Inkommande bearbetning går du till Ange frågeparametrar, skriver code för Namn, väljer +Värde, klistrar in den kopierade funktionsnyckeln och väljer Spara. API Management innehåller funktionsnyckeln när den skickar anrop till funktionsslutpunkten.

    Ange funktionsautentiseringsuppgifter till regeln för inkommande API-bearbetning

Nu när funktionsnyckeln har angetts kan du anropa turbine API-slutpunkten för att kontrollera att den fungerar när den finns i Azure.

Verifiera API:et i Azure

  1. I API:et väljer du fliken Test och sedan POST-körning, anger följande kod i begärandetexten> Raw och väljer Skicka:

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

    OpenAPI-testsida i API Management API

    Som tidigare kan du också ange samma värden som frågeparametrar.

  2. Välj Skicka och visa sedan HTTP-svaret för att kontrollera att samma resultat returneras från API:et.

Ladda ned OpenAPI-definitionen

Om ditt API fungerar som förväntat kan du ladda ned OpenAPI-definitionen för de nya värdbaserade API:erna från API Management.

    1. Under API:er väljer du OpenAPI-dokument på Azure Functions, väljer ellipserna (...) och väljer Exportera.

    Ladda ned OpenAPI-definition

  1. Välj metoder för API-export, inklusive OpenAPI-filer i olika format. Du kan också exportera API:er från Azure API Management till Power Platform.

Rensa resurser

I de föregående stegen skapade du Azure-resurser i en resursgrupp. Om du inte tror att du behöver dessa resurser i framtiden, kan du ta bort dem genom att ta bort resursgruppen.

På menyn Azure Portal eller startsidan väljer du Resursgrupper. Välj sedan den grupp som du skapade på sidan Resursgrupper .

På sidan myResourceGroup kontrollerar du att resurserna i listan är de som du vill ta bort.

Välj Ta bort resursgrupp, skriv namnet på din grupp i textrutan för att bekräfta och välj sedan Ta bort.

Nästa steg

Du har använt Visual Studio 2022 för att skapa en funktion som är självdokumenterad på grund av OpenAPI-tillägget och integrerat med API Management. Nu kan du förfina definitionen i API Management i portalen. Du kan också lära dig mer om API Management.