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

REST-API:er beskrivs ofta med en OpenAPI-definition. 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 guiden får du lära dig att:

  • Skapa ett serverlöst funktionsprojekt i Visual Studio
  • Testa funktions-API:er lokalt med hjälp av inbyggda OpenAPI-funktioner
  • Publicera projektet till en funktionsapp i Azure med API Management-integrering
  • Hämta åtkomstnyckeln för funktionen och ange den i API Management
  • 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 vindturbin är kostnadseffektiv. Eftersom både funktionsappen och API Management instans som du skapar använder förbrukningsplaner är kostnaden för att slutföra den här självstudien minimal.

Anteckning

OpenAPI- och API Management-integreringen som visas i den här artikeln stöds för närvarande endast för C#-klassbiblioteksfunktioner. Isolerad arbetsprocess C#-klassbiblioteksfunktioner och alla andra språkkörningar bör i stället använda Azure API Management integrering från portalen.

Förutsättningar

Skapa ett Functions-projekt

Den 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 som stöder generering av OpenAPI-definitionsfiler (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 mallen Azure Functions 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. Använd värdena i följande tabell för att skapa en ny Azure Functions programinställningar:

    Inställning Värde Beskrivning
    Functions Worker .NET 6 Det här värdet skapar ett funktionsprojekt som körs i processen på version 4.x av Azure Functions-körningen, vilket krävs för generering av OpenAPI-filer.
    Funktionsmall HTTP-utlösare med OpenAPI Det här värdet skapar en funktion som utlöses av en HTTP-begäran, med möjlighet att generera en OpenAPI-definitionsfil.
    Använda Azurite för körningslagringskonto (AzureWebJobsStorage) Markerat 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 om nycklar och auktorisering finns i funktionsåtkomstnycklar.

    Azure Functions projektinställningar

  5. Välj Skapa för att skapa funktionsprojekt- och HTTP-utlösarfunktionen, med stöd för OpenAPI.

Visual Studio skapar ett projekt och en klass med namnet Function1 som innehåller exempelkod för http-utlösarens funktionstyp. Sedan ersätter du den här funktionsmallkoden med din egen anpassade kod.

Uppdatera funktionskoden

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

Parameternamn Beskrivning
Timmar Den beräknade tiden för att göra en turbinreparation, upp till närmaste hela timme.
capacity Kapaciteten av turbinen, i kilowatts.

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 projektfilen Function1.cs ersätter du innehållet i den genererade klassbibliotekskoden med följande kod:

using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
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;

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

        [FunctionName("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 (ActionResult)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 testa 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 testning av TurbineRepair-API:et

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

    Svars-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 -.
    Prenumeration 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 din funktionsapp. 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. När du är tillbaka i Functions-instansen kontrollerar du att Kör från paketfilen är markerad. Funktionsappen distribueras med zip-distribution med läget Kör från paket aktiverat. Den här distributionsmetoden rekommenderas för ditt funktionsprojekt eftersom den ger bättre prestanda.

  7. Välj Nästa. 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änst Ny instans Välj Ny för att skapa en ny API Management instans på den serverlösa nivån.

    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, kontrollera att sidan Publicera står Klar att publicera och välj sedan Publicera för att distribuera paketet som innehåller dina projektfiler till din nya funktionsapp i Azure.

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

Hämta funktionens åtkomstnyckel

  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 väljer du Functions>TurbineRepair och sedan Funktionsnycklar.

    Hämta en åtkomstnyckel för funktionen TurbineRepair

  3. Under Funktionsnycklar väljer du standard och kopierar värdet. Nu kan du ange den här nyckeln i API Management så att den kan komma åt funktionsslutpunkten.

Konfigurera API Management

  1. På fliken Publicera väljer du ellipserna (...) bredvid Värd och väljer Öppna API i Azure Portal. Den API Management instans som du skapade öppnas i Azure Portal i standardwebbläsaren. Den här API Management-instansen är redan länkad till din funktionsapp.

  2. Under API:er väljer du OpenAPI-dokument på Azure Functions>POST Kör. Under Inkommande bearbetning väljer du sedan Lägg till princip.

    Lägga till en inkommande princip i API:et

  3. 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 autentiseringsuppgifter för funktionen för den inkommande API-bearbetningsregeln

Nu när funktionsnyckeln har angetts kan du anropa API:et för att verifiera att det fungerar när det 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:et

    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.

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

    Ladda ned OpenAPI-definition

  1. Välj metod 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å Azure Portal-menyn eller startsidan väljer du Resursgrupper. På sidan Resursgrupper väljer du sedan den grupp som du skapade.

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.