REST- en functieroutes

Voltooid

U hebt een schitterende API gemaakt. Veel kunt u er niet mee doen, maar goed: hij is er en dat is meer dan iemand die geen API's maakt, kan zeggen.

Migratie naar RESTful-API's

U hebt eindpunten met de namen CreateProduct, GetProducts, UpdateProduct en DeleteProduct. Eindpunten die op die manier worden genoemd, volgen een traditioneel API-naamgevingspatroon: Actie/resource.

Het naamgevingspatroon voor actie/resource is prima voor kleinere API's. Maar u weet nog dat Tailwind Traders in deze simulatie een ware internetreus is. De Products-API kan in een mum van tijd omslachtig worden. U kunt zich bijvoorbeeld voorstellen dat u een methode hebt met de naam 'GetProductByIdAndQuantityAndDate'. Deze typen methodenamen zijn niet alleen uitgebreid, maar ze maken code waarmee ze er onoverzichtelijk uitzien. Door API-namen met veel tekst wordt het voor ontwikkelaars moeilijker om te ontdekken hoe ze de API in hun projecten moeten gebruiken.

Het is nu uw taak om deze API er bondig en intuïtief uit te laten zien. Hiervoor gebruikt u het REST-patroon.

Azure Functions-routes en HTTP-aanvraagmethoden

In Azure Functions reageert elke HTTP-triggerfunctie standaard op GET- en POST-aanvragen. Ook wordt de URL van uw functie ingesteld op de naam van die functie, voorafgegaan door '/api'. U configureert beide om naar een RESTful-patroon te gaan.

Bedrijfstoepassingen

De HTTP-definitie voor een API in het Azure Functions v4-programmeermodel in deze voorbeeldtoepassing vindt u op ./api/src/index.ts en volgt het patroon:

const { app } = require('@azure/functions');

app.http('FunctionName',{
    methods: ['GET', 'POST'], 
    authLevel: 'anonymous', 
    route: 'routeName',
    handler: handlerFunction
});

De handler-functie is gescheiden van de definitie van de HTTP-trigger. Hierdoor kunt u veel flexibiliteit hebben in de manier waarop u uw functies definieert. U kunt de handlerfunctie definiëren in een afzonderlijk bestand en importeren in het index.ts bestand. Deze indeling is eenvoudiger te onderhouden of te genereren voor OpenAPI- of Swagger-documentatie.

Kleinere toepassingen

Kleinere toepassingen kunnen beter worden bediend door de handlercode rechtstreeks in de app aanroep te integreren met behulp van de methode van de app om de HTTP-methode op te geven. U kunt de handlerfunctie nog steeds scheiden of de code integreren.

Gebruik de app.get methode om de HTTP-methode en de handler-functie op te geven.

const { app } = require('@azure/functions');

app.get('FunctionName', handlerFunction);

Een andere alternatieve indeling, ideaal voor Functie-apps met één functie, is het rechtstreeks integreren van de handlercode in de app aanroep, met behulp van de methode van de app om de HTTP-methode op te geven. Voorbeeld:

const { app } = require('@azure/functions');

app.get('helloWorld',{
    handler: (request: HttpRequest, context: InvocationContext) => {
        return {
            status: 200,
            body: "Hello World"
        }
    }
}

Routeparameters

U kunt ook routeparameters gebruiken om een route te definiëren die een parameter accepteert. Met de volgende code wordt bijvoorbeeld een route gedefinieerd die een name parameter accepteert:

route: "products"

De volledige routedefinitie is:

app.http('GetProducts', {
    methods: ['GET', 'POST'],
    route: 'products',          // <- route: /api/products
    authLevel: 'anonymous',
    handler: GetProducts
});

Als u een route opgeeft, wordt alles na de API-sectie van de URL gewijzigd. In het vorige configuratiebestand is de route naar de functie GetProducts nu http://localhost:7071/api/products.

U kunt parameters doorsturen met een route. Parameters hebben de vorm van {parameterName}. Dit betekent dat u de volgende route opgeeft om een parameter door te geven die aan het product eindpunt wordt aangeroepenid.

route: "products/{id}"

Gewapend met deze nieuwe kennis van REST en hoe u deze implementeert in Azure Functions, kunt u die onhandige producten-API nu een RESTful maken. We gaan dat doen in de volgende oefening.